C ++ 11生成模板参数

时间:2015-06-10 19:46:30

标签: templates c++11 pack variadic

是否有可能以某种方式生成模板参数包?

我有以下代码:

zip<0,1,2>.expand(c);

我的目标是在编译时生成列表0,1,2,因为它将与可变参数模板一起使用,例如:

zip<make_sequence<3>>.expand(c);

我需要在编译时生成它,因为expand会触发一些模板化函数,这些函数会根据Layer / Filter类型进行优化,因此我可以启动其他代码。 这背后的想法是能够确定在编译时生成的层或过滤器列表并删除一些ifs(和其他情况),因为这将在非HPC环境中使用(并且在关键路径内)。

这是在这个类(简化版)中:

template<class... Layer>
class TRAV{  
  template <int...CS> struct zip{
    static void expand(int c){
      constexpr int b = sizeof...(Layers); 
      expand2((TRAV::path<CS,b,typename Layers::MONAD_TYPE>(c),0)...);
    }
  template<typename...IS>
    static void expand2(IS&&...) {
    }
 };
 void call(int c){ 
  zip<0,1,2>.expand(c); 
 }
};

我也尝试过提出的解决方案:

Implementation C++14 make_integer_sequence

How do I generate a variadic parameter pack?

但他们都没有为我工作。我收到这个错误:

  

错误:&gt;'模板

的模板参数列表中参数1的类型/值不匹配      

错误:预期类型为'int'的常量,得到'make_integer_sequence'

有什么建议吗? 非常感谢!!

2 个答案:

答案 0 :(得分:3)

你需要一个帮手:

template<int... Seq>
void call(int c, std::integer_sequence<int, Seq...>){
    zip<Seq...>::expand(c);
}

void call(int c){ 
    call(c, std::make_integer_sequence<int, 3>());
}

答案 1 :(得分:1)

除了@ T.C的解决方案。如图所示,您还可以制作与zip<make_sequence<3>>类似的内容。它看起来像这样:

apply_indices<zip<>,std::make_index_sequence<3>>

这种助手的实施是:

#include <utility>

template<typename,typename> struct apply_indices_impl;

template<typename T,template<T...> class C,T... Ns>
struct apply_indices_impl<C<>,std::integer_sequence<T,Ns...>>
{
    using type = C<Ns...>;
};

template<typename T,typename I>
using apply_indices = typename apply_indices_impl<T,I>::type;

Live example