1. 程式人生 > >C++ 函式模板與類模板template,以及具體化、例項化

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