如何将模板参数重复附加到类型中
How can I append template arguments repeatedly to a type?
我想创建一个元函数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;
}
然而,当我试图编译这个时,我得到了:
错误:模板参数列表中参数3的类型/值不匹配对于"template class Seq,class…"。。。Args>结构体附加'
我错过了什么?
下面我将解释一些小错误。这项工作:
#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
),因为否则,在第二次迭代中一个接一个地添加模板参数将失败。
最后,在从属名称Append<[...]>::type
前面需要一个typename
。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++ 模板:重载时找不到基类类型参数方法