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;