関数テンプレートの特殊化
//必须有一个基础模板
template<typename T>
void add(T a, T b) {
cout << "init template" << endl;
}
template<>
void add<int>(int a, int b) {
cout << "special template" << endl;
}
int main() {
add(2.1, 2.2); //init template
add(1, 3); //special template
add<int>(2.1, 2.2); //special template
return 0;
}
関数テンプレートで扱うことができない特殊な型については、通常、この型の通常の関数が定義され、関数テンプレートの特殊化はほとんど使用されず、関数テンプレートは部分的な特殊化をサポートしません。
クラス テンプレートの特殊化
//特化之前需要存在基础类模板
template<typename T, typename U>
class A {
public:
A() {
cout << "init template" << endl; }
};
//偏特化: 部分特化
template<typename T>
class A<T, int> {
public:
A() {
cout << "part special template" << endl; }
};
//全特化: 所有的参数都为具体类型
template<>
class A<int, int> {
public:
A() {
cout << "all special template" << endl; }
};
int main() {
A<int, int> a; //all special template
A<double, int> b; //part special template
A<double, double> c; //init template
return 0;
}
優先度:完全特化>部分特化>共通テンプレート
テンプレート呼び出しの選択
template<class T, class U> //原版类模板
class A {
public:
A(T a, U b) : a(a), b(b) {
cout << a + b << endl;
}
T a;
U b;
};
template<class T> //类模板的偏特化 必须在原版模板之后
class A<T, T> {
public:
A(T a, T b) : a(a), b(b) {
cout << a - b << endl;
}
T a, b;
};
/*********************************************************/
template<typename T> //函数模板的(类似重载) 位置不受限制
void func(T a, T b) {
cout << a - b << endl;
}
template<typename T, typename U> //原版函数模板
void func(T a, U b) {
cout << a + b << endl;
}
template<> //函数模板的全特化 必须在原版模板之后
void func(int a, int b) {
cout << a * b << endl;
}
int main() {
//匹配相似度最高的版本
A<int, int> a(1, 1); //0
func(1.0, 1.0); //0
return 0;
}