【问题标题】:Unpacking parameter packs multiple times多次解包参数包
【发布时间】:2018-01-28 01:14:46
【问题描述】:

是否可以多次解压参数包?

例如:我想得到一个包含 4 个向量的元组 - 2 个 int 类型和 2 个 float 类型。 要创建这样一个元组,我想使用如下语法:

ExampleClass<2, int, float> class;

是否可以创建这样的类?我正在考虑这样的事情:

template <int numUnpacks, typename ... Types>
class ExampleClass
{
     using Types = std::tuple<std::vector<Types>...>; // here i don't know how to unpack "std::vector<Types>...>" as often as "numUnpacks">
}

【问题讨论】:

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


    【解决方案1】:

    这可以使用 C++14 的 integer_sequence 来完成。如果您没有可用的,这里是implementationJonathan Wakely

    template <int numUnpacks, typename... Types>
    struct ExampleClass
    {
        template<typename T, size_t>
        using T_alias = T;
    
        template<typename T, size_t N, typename I = std::make_index_sequence<N>>
        struct repeat;
    
        template<typename T, size_t N, size_t... I>
        struct repeat<T, N, std::index_sequence<I...>> {
            using type = decltype(std::tuple_cat(std::declval<T_alias<T, I>>()...));
        };
    
        using type = typename repeat<std::tuple<std::vector<Types>...>, numUnpacks>::type;
    };
    

    ExampleClass&lt;2, int, float&gt;::typestd::tuple&lt;std::vector&lt;int&gt;, std::vector&lt;float&gt;, std::vector&lt;int&gt;, std::vector&lt;float&gt;&gt;

    Live demo

    【讨论】:

      【解决方案2】:

      用通常的递归模板部分特化废话看起来很简单:

      template<int n,class T,class... TT>
      struct Impl;
      
      template<int n,class... TT,class... UU>
      struct Impl<n,std::tuple<TT...>,UU...> :
        Impl<n-1,std::tuple<TT...,UU...>,UU...> {};
      
      template<class... TT,class... UU>  // just "class T" would be ambiguous
      struct Impl<0,std::tuple<TT...>,UU...>
      {using Types=std::tuple<std::vector<TT>...>;};
      
      template<int n,class... TT>
      struct ExampleClass : Impl<n,std::tuple<>,TT...> {};
      

      诀窍是尽早创建tuple,这样我们就可以一次保存多个模板参数包。

      【讨论】:

        猜你喜欢
        • 2021-12-27
        • 2021-12-13
        • 2021-04-09
        • 1970-01-01
        • 2019-04-14
        • 2016-06-19
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        相关资源
        最近更新 更多