我正在尝试使用模板元编程实现元组,但索引函数有问题 get
. Tuple
的执行类型是这样的:
template<typename A, typename... B>
class Tuple : Tuple<B...> {
private:
A val;
public:
using Base = Tuple<B...>;
Base* base() {
return static_cast<Base*>(this);
}
const Base* base() const {
return static_cast<const Base*>(this);
}
Tuple(A a, B... b): Base(b...), val(a) { }
A first() {
return val;
}
};
template<class A>
class Tuple<A> {
private:
A val;
public:
Tuple(A a): val{a} {}
A first() {
return val;
}
};
执行get
结构是:
template<int N, class... A>
struct get {
select<N,A...> operator()(Tuple<A...> t) {
return get<N-1>()(t.base());
}
};
template<class R, class... A>
struct get<0> {
R operator()(Tuple<R, A...> t) {
return t.first();
}
};
这是编译器给我的错误:
tuple.cpp:53:8: error: partial specialization of 'get' does not use any of its template parameters
struct get<0> {
^
1 error generated.
为什么会出现此错误?我该如何纠正它?
备注:select<N,A...>
是一个类型函数,它从 A
中选择第 N 个索引处的类型.
最佳答案
您的get
的主模板是:
template<int N, class... A>
struct get{ ... };
您的 get
的偏特化是:
template<class R, class... A>
struct get<0>{ ... };
特化接收单个模板参数,即:0
,但上面的主模板采用两个模板参数:
- 非类型模板参数
N
。 - 可变类型参数
A
。
此外,R
如何推导出来?
将 get
专门化为:
template<class R, class... A>
struct get<0, R, A...>{ ... };
将使 R
被推导成为可能:它将被推导为传递的可变参数的第一个元素的类型。例如,在:
get<0, int, float, double> foo;
R
将推导为 int
。
关于c++ - 偏特化不使用它的任何模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49328379/