Class templates 可以被偏特化(partial specialized,或称部份特化、局部特化)。这使你得以在特定情形下使用特殊实作码,但仍然留给你(使用者)选择 template parameters 的能力。
例如对于下面的 class template:
template <typename T1, typename T2>class MyClass {
...
};
// 偏特化:两个 template parameter 相同
template <typename T>
class MyClass<T,T> {
...
};
// 偏特化:第二个类型为 int
template <typename T>
class MyClass<T,int> {
...};
// 偏特化:两个 template parameter 均为指针类型
template <typename T1, typename T2>
class MyClass<T1*, T2*> {
...
};
以下例子示范,下列各种声明语句将使用上述哪一个 class template:
MyClass<int,float> mif; // 使用 MyClass<T1,T2>
MyClass<float,float> mff; // 使用 MyClass<T,T>
MyClass<float,int> mfi; // 使用 MyClass<T,int>
MyClass<int*,float*> mp; // 使用 MyClass<T1*,T2*>
如果某个声明语句与两个(或更多)偏特化版本产生同等的匹配程度,这个声明语句便被视为模棱两可(歧义):
MyClass<int,int> m; // 错误:同时匹配 MyClass<T,T> 和 MyClass<T,int>
MyClass<int*,int*> m; // 错误:同时匹配 MyClass<T,T> 和 MyClass<T1*,T2*>
为解除上述第二声明的歧义性,你可以针对「指向相同类型」的指针,提供另一个偏特化版本:
template <typename T>
class MyClass<T*,T*> {
...
};