模板特化允許為特定類型提供定制實現;偏特化則在多參數模板中僅特化部分參數。本文系統梳理類/函數模板的完全特化、偏特化語法與匹配優先級規則。
template <class T>
class Compare {
public:
bool isEqual(T a, T b) { return a == b; }
};
template <class T>
bool isEqual(T a, T b) { return a == b; }
template <>
class Compare<char*> { // 針對 char* 特化
public:
bool isEqual(char* a, char* b) { return strcmp(a, b) == 0; }
};
注意:類外定義成員時不加 template <>。
template <>
void vector<const char*>::push_back(const char* const& val) { ... }
template <>
bool isEqual<char*>(char* a, char* b) { return strcmp(a, b) == 0; }
// 原始模板
template <class T, class Alloc> class vector { ... };
// 偏特化:T 綁定為 bool,Alloc 保留
template <class Alloc>
class vector<bool, Alloc> { ... };
但可通過函數重載達到同樣效果:
template <class T> void f(T); // (a) 基模板 template <class T> void f(T*); // (b) 重載,針對指針類型 // (b) 不是偏特化,而是獨立模板,參與重載解析
template <class T> class Vector { ... }; // (a) 通用
template <class T> class Vector<T*> { ... }; // (b) 指針特化
template <> class Vector<void*> { ... }; // (c) void* 完全特化
Vector v1; // (a)
Vector v2; // (b) 比 (a) 更特化
Vector v3; // (c) 最特化
template <class T> void f(T); // (d) template <class T> void f(int, T, double); // (e) template <class T> void f(T*); // (f) template <> void f<int>(int); // (g) 完全特化 void f(double); // (h) 非模板 f(true); // (d) T=bool f(1,2,3.0); // (e) T=int f(&i); // (f) T=int* f(1); // (g) 完全特化優先於 (d) f(3.14); // (h) 非模板最高優先級
enable_if / 概念 约束。template <>,定義處不加。