Boost::variant 与引用相同变体的对象

Posted

技术标签:

【中文标题】Boost::variant 与引用相同变体的对象【英文标题】:Boost::variant with a object which references the same variant 【发布时间】:2021-04-20 14:14:01 【问题描述】:

我怎样才能拥有不同对象的变体A, B, C,其中C 引用了该变体?

class A 
   ...
;

class B 
   ...
;

class C 
   ...
   std::vector<PossibleValues> storage; // reference to variant
   ...
;

boost::variant<A, B, C> PossibleValues;

【问题讨论】:

不可能,除非你使用指针。这与类或结构不能包含自己的类型的原因相同。 您可以将typedefed 的每个类前向声明​​到变体中。声明 typedef 后,定义所有类,然后使用 typedef 定义变体的实例。 @SamVarshavchik 很难理解你的意思,你能提供答案吗? @Someprogrammerdude:std::vector“是”指针之类的。 struct S std::vector&lt;S&gt; children; ; 是可能的。 @Jarod42 你为什么要删除你的解决方案?我刚刚测试了它,它可以工作。 【参考方案1】:

如果顺序正确,您可能会:

class A 
   //...
;

class B 
   //...
;

class C;
using PossibleValues = std::variant<A, B, C>;

class C 
   //...
   std::vector<PossibleValues> storage; // reference to variant
   //...
;

Demo

【讨论】:

看来std::variant不能有不完整的类型,对吗? @AntoineMorrier:确实来自stdvariant-and-incomplete-type。 :-(

以上是关于Boost::variant 与引用相同变体的对象的主要内容,如果未能解决你的问题,请参考以下文章

boost::variant - 在变体上应用算术的最简单方法

boost::variant 与 bool 和 string

(C++, boost::variant) boost 变体映射的数据类型并对其执行数学运算

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

boost::variant 单一存储保证

如何使用变体创建几何图形