Вы не можете сохранить ссылку в variant
(см. std::variant
ссылку , которая явно прописывает это, но boost::variant
очень похожа), поскольку ссылка - это просто другое имя переменной,variant
- это необычная реализация union
.В обоих случаях значение сохраняется внутри union
/ variant
.Получение вашего объекта может стоить копии.
Для небольших объектов я бы не беспокоился о копии.Если ваши объекты большие и вам нужно избегать копирования, вы можете вместо этого использовать указатели:
boost::variant<Point*, Line*, Circle*> shape;
shape s = &p;
С указателями вы можете даже решить реализовать это, используя традиционный полиморфный подход, а не variant
(определите абстрактный класс shape
, который Point
, Line
и Circle
наследуют, и сделайте s
указатель родительского типа:
shape s = &p;
Обратите внимание, что последний может быть более подвержен ошибкам, чем использование variant
.