У меня есть куча типов, PixelMeasure
, PointMeasure
, CentimeterMeasure
и т. Д., Которые представляют собой значение с единицей. Я бы хотел, чтобы у них былоПолиморфизм (наследование) и типы значений
- Значение семантика: напр. эффективно не изменяются, не нужно беспокоиться о распределении памяти, и
- Полиморфизм: я могу вернуть объект типа
Measure
и работать с ним, не зная, какой он вид. Я также хотел бы разместить несколько разныхMeasure
s в контейнере.
Кажется, что они являются взаимоисключающими в C++. Для полиморфизма мне нужно использовать указатели или ссылки.
Я вижу два варианта:
- Используйте смарт-указатели, например,
shared_ptr
. Это дает мне поведение, которое я хочу (безопасный, без сырых указателей, но полиморфная отправка). Нижеследующие стороны:- Это многословие (я мог бы спрятать его за typedef, если бы захотел).
- У вас есть распределение памяти, идущее под капотом (но код не критичен по производительности, и он скрыт).
- Семантика wierd - копия моего объекта (
shared_ptr<PixelMeasure>
) будет использовать один и тот же базовый указатель. Я все еще могу притвориться, что у него есть семантика значений - если я сделаю интерфейс неизменным, это не имеет значения.
- Я кратко подумал о том, что вы не используете наследование (нет общего базового класса) и диспетчеризации через шаблоны - но в этом случае мне нужно знать точный тип измерения во время компиляции и не может помещать их в контейнеры ,
- Я мог бы полностью избавиться от классов и просто использовать один класс со значением и единичным полем, но это было бы намного менее гибким, а синтаксис использования был бы хуже, поэтому я бы предпочел избежать этого.
Любые идеи?
Как насчет [Пользовательских литералов] (http://en.cppreference.com/w/cpp/language/user_literal)? –
Определенные пользователем литералы дали бы мне хороший способ использовать их в коде, но это 1. только синтаксический сахар, основное представление является независимым и 2. Я редко создаю эти экземпляры в коде. Они анализируются из файлов конфигурации. То, что я делаю, например, преобразует их в пиксели или отображает их как есть. Существуют также более сложные единицы, такие как процент от высоты окна, которые ссылаются на окно, например. – jdm
Оберните указатель на базу? Или еще лучше, есть вариант? – lorro