C++中函數模板,顯式具體化,顯式實例化:


函數模板

形如:

template<typename T>  //沒有分號

void func(T &a,T &b);

稱為函數模板,其中,template和typename為關鍵字,typename可以用class來替代。T(可以用其他的名稱)表示一種泛型,既可以表示int型,也可以表示double或其他類型,將它想象成C++里面的數據類型的集合。

也就是說:

void func(T &a,T &b)= void func(int &a,int &b)

                  = void func(double &a,double &b)

                  = void func(char &a,char &b)

                  =………

在調用func()函數的時候,會根據形參的類型來選擇用哪個func()函數,可以減少代碼量。

函數模板也可以重載,如將形參換成兩種不同的數據類型:

template<typename T1,typename T2> 

void func(T1 &a,T2 &b);

或者是這種:

template<typename T> 

void func(T &a,T &b T&c);

對於函數的模板,每次調用函數時的形參的類型可能不一樣,但函數體里實現的內容其實都一樣。比如下面的代碼:

template<typename T> 

T func(T &a,T &b)

{

       return a>b?a:b;

}

實現的內容都是:返回啊a,b中較大的數。

顯式具體化

但對於某些特殊類型,可能不適合模板實現,需要重新定義實現,此時就是使用顯式具體化。

首先的聲明一個函數模板,然后再定義特殊類型,如下:

template<typename T> 

void func(T &a,T &b);//首先聲明函數模板

//例如結構體類型的變量不適合,那么我們需要將函數模板再具體一些

struct strc {……};//結構體

template<>void func<strc>(strc &t1,strc &t2);

然后再在主函數后面寫出實現方法。

//函數模板的實現

template<typename T> 

void func(T &a,T &b)

{……}

//顯式具體化的實現

template<>void func<strc>(strc &t1,strc &t2)

{……}

實例化

假如我們在主函數中要調用函數模板,他就會在主函數中創建一個實例,不調用它就不會產生實例,比如a,b都是int型的,在主函數中有這一句: func(a,b);那么就會創建void func(int,int)這樣一個函數,這種叫隱式實例化。后面有程序用了,編譯器才會根據模板生成一個實例函數。

還有一種叫顯式實例化,不用將相應的實參傳遞給形參才創建實例,而是顯示的聲明需要程序創建這個實例,在函數體里聲明:

template void func<char>(char &,char &);

無論是否程序有用,編譯器都會生成一個實例函數。

顯式實例化和顯式具體化聲明注意區分。一個template后有<>,一個則沒有。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM