函數模板:需要創建針對不同參數類型的實現相同功能的不同函數。注:模板不能縮短可執行程序,最終仍是有多個獨立的函數定義。
另,若對不同類型的參數執行不同的算法,可以重載模板定義,前提是兩函數的特徵標不同。
例:template <typename T> //或者class T
void Swap(T &a, T&b) //交換
{
T temp;
temp=a;
a=b;
b=temp;
}
顯示具體化:當參數相同不能實現重載時,可以考慮顯示具體化。原型和定義以template<>打頭。具體化優先於常規模板,非模板函數優先於具體化和常規模板。
例:template <> void Swap<job>(job &j1, job &j2) //其中job是一種結構名
顯示實例化:意思是“不要使用常規模板來生成函數定義,而應使用專門爲Int類型顯示定義的函數的定義”。以template開頭。
例:template void Swap<int> (int a1, int a2)
類模板:調用時將具體的類型作爲參數傳遞給這個類。例如經典的valarray(定義了數組中元素的數值操作)、vector、array。需要在類聲明前、類函數定義前以template <class Type>開頭,類限定符也要修改爲classname<Type>::。
例:
template <class Type>
class Stack
{
private:
enum {MAX=10};
Type items[MAX];
int top;
public:
Stack();
……
}
template <class Type>
Stack<Type>::Stack()
{
top=0;
}
相比於函數模板,類模板必須顯式的提供所需的類型。
類模板中非類型參數/表達式參數:可用於使用模板參數來提供數組的大小。
template <class T, int n> //其中n爲表達式參數(指定特殊的類型)
例:聲明對象:classname<double, 12> example; //使用double替換T,使用12替換n
注:1.表達式參數可以是整型、枚舉、引用或指針。所以double等不合法;
2.模板代碼不能修改參數的值,也不能使用參數的地址。例不能使用n++,&n等;
3.實例化模板時,用作表達式參數的值必須是常量表達式。