是否有可能像下面的伪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);
}
On coliru: http://coliru.stacked-crooked.com/a/2439048b107642c2
这当然是可能的。关键是必须使用某种类型的包扩展。你的结构接受一个int
非类型模板参数。因此,我们必须扩展整数序列的包,将它们一次一个地送入MyStruct
。
MyStruct<MyIntegerSequence>...
不是一个包扩展,因为在这个上下文中没有模板定义,也没有包。
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{}));