C++ 中变体的变体

Variant of variants in C++

我有以下变体

std::variant<Type1, Type2<subType1>> myVariant;

Type2 是一个模板 class,有 2 种可能的子类型 subType1 和 subType2 都是可能的。 以下是否受支持?

std::variant<Type1, Type2<std::variant<subType1,subType2>> myVariant;

如果是,get<index>(myVariant) 将如何使用内部变体?

编辑:修正拼写错误

Is the following supported?

是的,但不是你想的那样。

std::variant<Type1, Type2<std::variant<subType1, subType2>>> myVariant;

等同于:

using SomeType = Type2<std::variant<subType1, subType2>>;
std::variant<Type1, SomeType> myVariant;

SomeType 是模板化的事实不会改变变体的工作方式。所以:

If yes, how would get(myVariant) work with the inner variant?

get<index>(myVariant) 将 return 成为 Type1Type2<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>> 使用起来会简单得多...