2014-10-16 32 views
0

我想要创建一个元函数,Append采用模板类型,并将N类型参数的数量T添加到模板,例如,如果我调用Append<2, int, std::tuple<>>我想获得std::tuple<int, int>如何将模板参数重复附加到某个类型?

这里是我试过:

#include <tuple>                 

template <int N, typename T, template <class> class Seq, typename... Args>  
struct Append;                 

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

template <typename T, template<class> 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;          

int main()                   
{                     
    return 0;                  
}    

然而,当我尝试编译此我得到:

error: type/value mismatch at argument 3 in template parameter list for ‘template class Seq, class ... Args> struct Append’

我缺少什么?

+0

* error:模板模板参数的模板参数必须是类模板或类型别名模板*在'Seq > – chris 2014-10-16 23:07:25

回答

2

我会在下面解释一些小错误。这工作:

#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),否则,在第二次迭代中,一个接一个地添加模板参数将失败。

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