【问题标题】:Template parameter pack attribute模板参数包属性
【发布时间】:2017-03-19 10:14:01
【问题描述】:

我们有模板类:

template<int i>
class A
{
...
};

但是如何声明模板类的打包器:

template<int... is>
Pack
{

private:
    A<is...> attrs;
};

或者如何收集A类?

【问题讨论】:

    标签: c++ c++11 templates variadic-templates


    【解决方案1】:

    std::tuple为例

    #include <tuple>
    
    template <int i>
    class A
     { };
    
    template <int... is>
    class Pack
     { std::tuple<A<is>...>  attrs; };
    
    int main()
     {
       Pack<2,3,5,7,11,13>  p;
     }
    

    另一种方式是通过继承

    template <int i>
    class A
     { };
    
    template <int... is>
    class Pack : A<is>...
     { };
    
    int main()
     {
       Pack<2,3,5,7,11,13>  p;
     }
    

    【讨论】:

      【解决方案2】:

      我知道的最佳方法是使用类型列表

      template<class...> struct type_list{};
      
      template<int...Is>
      using a_pack = type_list<A<Is>...>;
      

      使用类型列表,很容易进行转换或 对每个成员进行操作。例如,让我们用前面的代码创建一个 std:vector 的 type_list:

      template<class> struct vectors_of;
      
      template<class...As> struct vectors_of<type_list<As...>>{
           using type=type_list<std::vector<As>...>;
      };
      using vectors_of_a = typename vectors_of<a_pack<1,2>>::type;
      

      他们有很多关于类型列表的文档。这是基本工具之一 本书以来的元程序员:Modern C++ Design(使用 pre-c++11)。有了 C++11,使用起来就更简单了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-07
        • 2021-01-11
        • 2020-04-29
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        相关资源
        最近更新 更多