如何将模板参数重复附加到类型?

时间:2014-10-16 23:00:45

标签: c++ templates

我想创建一个元函数Append,它采用模板化类型并将NT类型的参数添加到模板中,例如,如果我调用{{1}我想得到Append<2, int, std::tuple<>>

这是我尝试过的:

std::tuple<int, int>

但是,当我尝试编译时,我得到:

  

错误:模板参数列表中参数3的类型/值不匹配   对于'模板类Seq,类......   参数数量&GT; struct追加'

我错过了什么?

1 个答案:

答案 0 :(得分:3)

我将在下面解释一些小错误。这有效:

#include <tuple>                                                                

template <int N, typename T, typename SeqWithArgs>      
struct Append;                                                                  

template <int N, typename T, template <typename...> class Seq, typename... Args >      
struct Append<N, T, Seq<Args...> >                                               
{                                                                               
    using type = typename Append<N-1, T, Seq<T,Args...> >::type;                         
};                                                                              

template <typename T, template<typename...> class Seq, typename... Args>              
struct Append<0, T, Seq<Args...> >                                               
{                                                                               
    using type = Seq<Args...>;                                                  
};                                                                              

// create a big tuple with N number of "int" types in it                           
using T = Append<2, int, std::tuple<> >::type;                                      

static_assert(std::is_same<T,std::tuple<int,int>>::value,"Didn't work");

int main()                                                                         
{                                                                                  
    return 0;                                                                      
}

您的非专业化模板类存在一个问题:您希望它有三个参数,第三个参数实际上是一个类型而不是模板类(将您的调用与tuple<>进行比较)。这就是你得到错误的原因,因为你传递了编译器期望模板的类型。

然后,对于专业化,您现在想要推导出模板模板参数,因此将模板及其模板参数分为SeqArgs的四个模板参数实际上是正确的。但是,它必须是一个可变参数模板类(不仅仅是你问题中的template <class> class Seq),因为否则,在第二次迭代中一个接一个地添加模板参数会失败。

然后,最后,您需要在从属名称typename前面Append<[...]>::type