C++ 如何在boost::variant<;中存储引用;T>;而不是复制对象?

C++ 如何在boost::variant<;中存储引用;T>;而不是复制对象?,c++,boost,variant,boost-variant,C++,Boost,Variant,Boost Variant,假设我有一个boost::variant定义为boost::variant shape。现在,如果我为Point类创建一个对象,Point p,并将其存储在形状中,作为shape=p我在这里做的是创建p的副本。我如何实际存储对p的引用,以便在调用boost::apply_visitior(visitor,shape)时,visitor不仅会变异变量中存储的点,还会变异p本身 boost::variant<Point*, Line*, Circle*> 然后让访问者在指针上超载 然

假设我有一个
boost::variant
定义为
boost::variant shape
。现在,如果我为Point类创建一个对象,
Point p
,并将其存储在形状中,作为
shape=p
我在这里做的是创建p的副本。我如何实际存储对p的引用,以便在调用
boost::apply_visitior(visitor,shape)
时,visitor不仅会变异变量中存储的点,还会变异
p
本身

boost::variant<Point*, Line*, Circle*> 
然后让访问者在指针上超载


然后让访问者在指针上过载。

您不能在
变量中存储引用(请参阅,其中明确说明了这一点,但
boost::variant
非常类似),因为引用只是变量的另一个名称
variant
union
的奇特实现。在这两种情况下,该值都存储在
联合
/
变量
中。把你的东西放进去可能要付出复制的代价

对于小物件,我不会担心复制品。如果您的对象很大并且需要避免复制,那么您可能需要考虑使用指针来代替:

boost::variant<Point*, Line*, Circle*> shape;
shape s = &p;

请注意。

由于引用只是变量的另一个名称,因此不能将引用存储在
variant
中(请参阅,其中明确说明了这一点,但
boost::variant
非常类似)
variant
union
的奇特实现。在这两种情况下,该值都存储在
联合
/
变量
中。把你的东西放进去可能要付出复制的代价

对于小物件,我不会担心复制品。如果您的对象很大并且需要避免复制,那么您可能需要考虑使用指针来代替:

boost::variant<Point*, Line*, Circle*> shape;
shape s = &p;

请注意。

您不能,也不能更改形状以允许引用。您不能,也不能更改形状以允许引用。
shape s = &p;