1. 程式人生 > >C++中函數模板,顯式具體化,顯式實例化:

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

程序 使用 集合 typename 內容 方法 區分 bsp 代碼

函數模板

形如:

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後有<>,一個則沒有。

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