作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个元函数,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’
我错过了什么?
最佳答案
我将在下面解释一些小错误。这有效:
#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
.
关于c++ - 如何将模板参数重复附加到类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415291/
我是一名优秀的程序员,十分优秀!