我想创建一个元函数Append
,它采用模板化类型并将N
个T
类型的参数添加到模板中,例如,如果我调用{{1}我想得到Append<2, int, std::tuple<>>
。
这是我尝试过的:
std::tuple<int, int>
但是,当我尝试编译时,我得到:
错误:模板参数列表中参数3的类型/值不匹配 对于'模板类Seq,类...... 参数数量&GT; struct追加'
我错过了什么?
答案 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<>
进行比较)。这就是你得到错误的原因,因为你传递了编译器期望模板的类型。
然后,对于专业化,您现在想要推导出模板模板参数,因此将模板及其模板参数分为Seq
和Args
的四个模板参数实际上是正确的。但是,它必须是一个可变参数模板类(不仅仅是你问题中的template <class> class Seq
),因为否则,在第二次迭代中一个接一个地添加模板参数会失败。
然后,最后,您需要在从属名称typename
前面Append<[...]>::type
。