是否可以从整数序列生成变体?
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);
}
当然有可能。关键是必须使用某种扩展包。您的结构采用 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{}));
是否可以像这个伪 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);
}
当然有可能。关键是必须使用某种扩展包。您的结构采用 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{}));