C ++中的变体变体
Posted
技术标签:
【中文标题】C ++中的变体变体【英文标题】:Variant of variants in C++ 【发布时间】:2021-09-13 21:09:25 【问题描述】:我有以下变体
std::variant<Type1, Type2<subType1>> myVariant;
Type2 是一个模板类,有 2 种可能的子类型 subType1 和 subType2 是可能的。 是否支持以下内容?
std::variant<Type1, Type2<std::variant<subType1,subType2>> myVariant;
如果是,get<index>(myVariant)
将如何处理内部变体?
编辑:修正错字
【问题讨论】:
这完全取决于Type2<T>
是什么,它的界面如何工作,以及您如何访问T
对Type2
的含义。 Type2<T>
对其T
的作用取决于类型。它可以存储一个T
,或一组T
s 或其他任何东西。没有专门为 C++ 或 variant
提供支持的东西;这一切都在您的代码中。
【参考方案1】:
是否支持以下内容?
是的,但不是你想的那样。
std::variant<Type1, Type2<std::variant<subType1, subType2>>> myVariant;
与以下内容相同:
using SomeType = Type2<std::variant<subType1, subType2>>;
std::variant<Type1, SomeType> myVariant;
SomeType
是模板化的事实不会改变变体的工作方式。所以:
如果是,get(myVariant) 如何使用内部变体?
get<index>(myVariant)
将返回 Type1
或 Type2<std::variant<subType1, subType2>>
。内部变体不会以任何形式或形式发挥作用。
【讨论】:
【参考方案2】:问题在于std::variant
是一种新类型,并且不同于它可以包含的所有类型。就像一个好的旧工会:
union int_or_double
int i;
double d;
;
它既不是int
也不是double
,而是一个可以保存int
值或double
值的独特类型。
所以这里std::variant<Type1, Type2<std::variant<subType1,subType2>> myVariant;
不能只保存Type2<std::variant<subType1,subType2>>
的值,但既不能保存Type2<subType1>
,也不能保存Type2<subType2>
(当然还有Type1
...)。
在现实世界的编程中,我认为std::variant<Type1, Type2<subType1>, Type2<subType2>>
使用起来会简单得多...
【讨论】:
谢谢std::variant<Type1, Type2<subType1>, Type2<subType2>>
是我要做的。以上是关于C ++中的变体变体的主要内容,如果未能解决你的问题,请参考以下文章
我可以将一个类与模板中的另一个类关联(使用 C++17 变体)吗?