C++ 函式模板與類模板template,以及具體化、例項化
函式模板:需要建立針對不同引數型別的實現相同功能的不同函式。注:模板不能縮短可執行程式,最終仍是有多個獨立的函式定義。
另,若對不同型別的引數執行不同的演算法,可以過載模板定義,前提是兩函式的特徵標不同。
例: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.例項化模板時,用作表示式引數的值必須是常量表達式。