代码之家  ›  专栏  ›  技术社区  ›  matovitch

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

  •  0
  • matovitch  · 技术社区  · 4 年前

    #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

    1 回复  |  直到 4 年前
        1
  •  1
  •   StoryTeller - Unslander Monica    4 年前

    当然,这是可能的。关键是必须使用某种包扩展。你的结构需要 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{}));