我有以下变体
std::variant<Type1, Type2<subType1>> myVariant;
Type2是一个模板类,有2种可能的子类型subType1和subType2。是否支持以下操作?
std::variant<Type1, Type2<std::variant<subType1,subType2>> myVariant;
如果是,get<index>(myVariant)
如何与内部变体一起工作?
编辑:fix typo
是否支持以下操作?
是的,但不是你想的那样。
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>>
。内部变量不以任何形式或形式发挥作用。
问题是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>>
使用起来要简单得多…