是否可以从整数序列生成变体?

Is it possible to generate a variant from an integer sequence?

是否可以像这个伪 C++ 示例中那样从整数序列生成变体:

#include <utility>
#include <variant>

template <int MyInt>
struct MyStruct{};

using MyIntegerSequence = std::make_integer_sequence<int, 3>;

using MyVariant = std::variant<MyStruct<MyIntegerSequence>...>; // Does not compile

int main()
{
    return sizeof(MyVariant);    
}

关于大肠杆菌:http://coliru.stacked-crooked.com/a/2439048b107642c2

当然有可能。关键是必须使用某种扩展包。您的结构采用 int 非类型模板参数。所以我们必须扩展整数序列的包以一次将它们送入MyStruct

MyStruct<MyIntegerSequence>... 不是包扩展,因为在该上下文中没有模板定义和包。

例如,使用 class 模板(和部分专业化):

template<typename Seq> struct MyVariantHelper;

template<int... Is> struct MyVariantHelper<std::integer_sequence<int, Is...>> {
    using type = std::variant<MyStruct<Is>...>;
};

using MyVariant = MyVariantHelper<MyIntegerSequence>::type;

或者使用函数模板和 decltype:

template<int... Is>
auto MyVariantHelper(std::integer_sequence<int, Is...>) 
  -> std::variant<MyStruct<Is>...>;

using MyVariant = decltype(MyVariantHelper(MyIntegerSequence{}));