1. 函數模板特例化
template<typename T>
int func(T, T) {...}; //原始的、最通用的版本
template<> //空尖括號指出我們將爲原模板的所有模板參數提供實參
int func(char, char) {...}; //特例化爲char型的函數,函數可以有新的實現體
2. 類模板特例化
template<typename T>
class C {...}; //原始的、最通用的版本
template<>
class C<int> {...}; //類模板特例化爲int型的類
3. 特例化類的成員
template<typename T>
class C
{
void bar() {...}
};
template<> //我們正在特例化一個模板
void C<int>::bar() {...} //我們正在特例化C<int>的成員bar,可以有新的函數體
使用示例:
C<string> fs;
fs.bar(); //沒有使用特例化版本
C<int> fi;
fi.bar(); //將使用特例化版本C<int>::bar()
4. 類模板部分特例化(偏特化,partial specialization)
類模板的部分特例化本身是一個模板,使用它時用戶還必須爲那些在特例化版本中未指定的模板參數提供實參。
template<typename T>
class C {...}; //原始的、最通用的版本
template<typename T>
class C<T*> {...}; //該特化版本只適用於“T爲原生指針”的情況
template<typename T>
class C<T&> {...}; //該特化版本只適用於“T爲左值指針”的情況
template<typename T>
class C<T&&> {...}; //該特化版本只適用於“T爲右值指針”的情況