模板的静态模板成员函数 class
Static template member function for template class
我有一个模板class和一个模板成员函数:
template<class T1>
struct A{
template<class T2>
static int f(){return 0;}
};
我想专门处理 T1
和 T2
相同的情况,
例如,为任何 T
.
定义大小写 A<T>::f<T>
但我找不到实现此目的的关键字组合。
如何部分(?)特化模板 class 和模板静态函数的组合?
这些是我的不成功 次尝试,以及错误消息:
1) 专攻class: fatal error: cannot specialize a function 'f' within class scope
)
template<class T1>
struct A{
template<class T2>
static int f(){return 0;}
template<>
static int f<T1>(){return 1;}
};
2) class "simultaneously" 之外的专业:fatal error: cannot specialize a member of an unspecialized template
template<class T>
void A<T>::f<T>(){return 1;}
3) 专门使用 template<>
:fatal error: too few template parameters in template redeclaration
template<> template<class T>
void A<T>::f<T>(){return 1;}
4) 颠倒顺序:fatal error: cannot specialize (with 'template<>') a member of an unspecialized template
template<class T> template<>
void A<T>::f<T>(){return 1;}
5) 特化整个class(基于尝试3的错误):fatal error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
template<class T>
struct A<T>{
template<>
static int f<T>(){return 1;}
};
6) 特化 class 而不是函数 (?): fatal error: too few template parameters in template redeclaration
template<> template<class T1>
template<> template<class T>
int A<T>::f(){return 0;}
我使用 clang 3.5 C++14
生成错误消息。
您不能部分特化一个函数。
您可以将作品转发给其他类型:
template<class T1>
struct A;
template<class T1, class T2>
struct A_helper {
static int f() {
return A<T1>::f_simple<T2>();
}
};
template<class T>
struct A_helper<T,T> {
static int f() {
return A<T>::f_special();
}
};
template<class T1>
struct A{
template<class T2>
static int f(){return A_helper<T1,T2>::f()}
template<class T2>
static int f_simple(){return 0;}
static int f_special(){return -1;}
};
或者更简单地说,没有 A_helper
:
template<class T1>
struct A{
template<class T2>
static int f(){return f2<T2>(std::is_same<T1,T2>{});}
template<class T2>
static int f2(std::true_type){
static_assert(std::is_same<T1,T2>{}, "bob!");
return -1;
}
template<class T2>
static int f2(std::false_type){return -1;}
};
您可以使用标签调度。
另一种方法:
template<class T>struct tag{};
template<class T1>
struct A{
template<class T2>
static int f(){return f2(tag<T2>{});}
template<class T2>
static int f2(tag<T2>) {return 0;}
static int f2(tag<T1>) {return -1;}
};
我们直接在 T2
.
类型上调度
我有一个模板class和一个模板成员函数:
template<class T1>
struct A{
template<class T2>
static int f(){return 0;}
};
我想专门处理 T1
和 T2
相同的情况,
例如,为任何 T
.
A<T>::f<T>
但我找不到实现此目的的关键字组合。
如何部分(?)特化模板 class 和模板静态函数的组合?
这些是我的不成功 次尝试,以及错误消息:
1) 专攻class: fatal error: cannot specialize a function 'f' within class scope
)
template<class T1>
struct A{
template<class T2>
static int f(){return 0;}
template<>
static int f<T1>(){return 1;}
};
2) class "simultaneously" 之外的专业:fatal error: cannot specialize a member of an unspecialized template
template<class T>
void A<T>::f<T>(){return 1;}
3) 专门使用 template<>
:fatal error: too few template parameters in template redeclaration
template<> template<class T>
void A<T>::f<T>(){return 1;}
4) 颠倒顺序:fatal error: cannot specialize (with 'template<>') a member of an unspecialized template
template<class T> template<>
void A<T>::f<T>(){return 1;}
5) 特化整个class(基于尝试3的错误):fatal error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
template<class T>
struct A<T>{
template<>
static int f<T>(){return 1;}
};
6) 特化 class 而不是函数 (?): fatal error: too few template parameters in template redeclaration
template<> template<class T1>
template<> template<class T>
int A<T>::f(){return 0;}
我使用 clang 3.5 C++14
生成错误消息。
您不能部分特化一个函数。
您可以将作品转发给其他类型:
template<class T1>
struct A;
template<class T1, class T2>
struct A_helper {
static int f() {
return A<T1>::f_simple<T2>();
}
};
template<class T>
struct A_helper<T,T> {
static int f() {
return A<T>::f_special();
}
};
template<class T1>
struct A{
template<class T2>
static int f(){return A_helper<T1,T2>::f()}
template<class T2>
static int f_simple(){return 0;}
static int f_special(){return -1;}
};
或者更简单地说,没有 A_helper
:
template<class T1>
struct A{
template<class T2>
static int f(){return f2<T2>(std::is_same<T1,T2>{});}
template<class T2>
static int f2(std::true_type){
static_assert(std::is_same<T1,T2>{}, "bob!");
return -1;
}
template<class T2>
static int f2(std::false_type){return -1;}
};
您可以使用标签调度。
另一种方法:
template<class T>struct tag{};
template<class T1>
struct A{
template<class T2>
static int f(){return f2(tag<T2>{});}
template<class T2>
static int f2(tag<T2>) {return 0;}
static int f2(tag<T1>) {return -1;}
};
我们直接在 T2
.