Как сохранить ссылку в boost :: option <T>вместо копирования объекта? - PullRequest
1 голос
/ 28 мая 2019

Предположим, у меня boost::variant определено как boost::variant<Point, Line, Circle> shape. Теперь, если я создаю объект класса Point, Point p и сохраняю его в форме как shape = p, я делаю копию p. Как на самом деле сохранить ссылку на p таким образом, чтобы при вызове boost::apply_visitior(visitor, shape) посетитель мутировал не только в точке, хранящейся в варианте, но и в самой p?

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Вы не можете сохранить ссылку в 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.

0 голосов
/ 28 мая 2019
boost::variant<Point*, Line*, Circle*> 

тогда

shape = &p;

тогда пусть ваш посетитель перегружает указатели.

...