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後有<>,一個則沒有。
C++中函數模板,顯式具體化,顯式實例化: