可以在模板定义之外专门化一些类成员函数:
template<class A>
struct B {
void f();
};
template<>
void B<int>::f() { ... }
template<>
void B<bool>::f() { ... }
在这种情况下,我甚至可以省略一般类型f
的函数A
的定义。
但是如何把这个专业化放在课堂上呢?像这样:
template<class A>
struct B {
void f();
void f<int>() { ... }
void f<bool>() { ... }
};
在这种情况下我应该使用什么语法?
编辑:
目前,使用最少代码行的解决方案是添加假模板函数f
定义并从原始函数f
显式调用它:
template<class A>
struct B {
void f() { f<A>(); }
template<class B>
void f();
template<>
void f<int>() { ... }
template<>
void f<bool>() { ... }
};
答案 0 :(得分:6)
您应该将专业化放在struct
:
template<>
struct B<int> {
void f() { ... }
};
template<>
struct B<bool> {
void f() { ... }
};
无法在定义模板化版本的同一个类中专门化成员函数。要么必须在类外部明确地专门化成员函数,要么专门化一个包含成员函数的整个类。
答案 1 :(得分:4)
您可以在结构中使B::f
成为模板函数:
struct B {
template <typename T>
void f();
template<>
void f<int>() { ... }
template<>
void f<bool>() { ... }
};
编辑:
根据你的评论,这可能对你有帮助,但我没有测试它是否有效:
template <typename A>
struct B {
template <typename T = A>
void f() { ... }
template<>
void f<int>() { ... }
template<>
void f<bool>() { ... }
};
答案 2 :(得分:0)
#include<iostream>
using namespace std;
template<class A>
class B
{
public:
void f() {
cout << "any" << endl;
}
};
template<>
class B<int>
{
public:
void f() {
cout << "int" << endl;
}
};
int main()
{
B<double> b1;
b1.f();
B<int> b2;
b2.f();
return 0;
}
输出:
any
int
其他任何事情都是不可能的。