I have the following variant
std::variant<Type1, Type2<subType1>> myVariant;
Type2 is a template class, there are 2 possible sub types subType1, and subType2 are possible. Is the following supported?
std::variant<Type1, Type2<std::variant<subType1,subType2>> myVariant;
If yes, how would get<index>(myVariant) work with the inner variant?
edit: fix typo
CodePudding user response:
Is the following supported?
Yes, but not in the way you think.
std::variant<Type1, Type2<std::variant<subType1, subType2>>> myVariant;
is the same thing as:
using SomeType = Type2<std::variant<subType1, subType2>>;
std::variant<Type1, SomeType> myVariant;
The fact that SomeType is templated changes nothing to how the variant works. So:
If yes, how would get(myVariant) work with the inner variant?
get<index>(myVariant) will return either a Type1 or a Type2<std::variant<subType1, subType2>>. The inner variant does not come into play in any way shape or form.
CodePudding user response:
The problem is that a std::variant is a new type and is distinct from all the types it can hold. Just like a good old union:
union int_or_double {
int i;
double d;
};
which is neither an int nor a double but a distinct type that can hold either an int value or a double value.
So here std::variant<Type1, Type2<std::variant<subType1,subType2>> myVariant; cannot only hold values of Type2<std::variant<subType1,subType2>> but neither Type2<subType1>, nor Type2<subType2> (and of course Type1...).
In real world programming, I think that std::variant<Type1, Type2<subType1>, Type2<subType2>> would be much simpler to use...
