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.實例化模板時,用作表達式參數的值必須是常量表達式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章