C++ Primer 之函數(shù)模板

函數(shù)模板是通用的函數(shù)描述,通過(guò)將類(lèi)型作為參數(shù)傳遞給模板,使編譯器生成可用具體的類(lèi)型的函數(shù)。類(lèi)似于:

template<class Any>
void swap(Any &a, Any &b);

對(duì)于不同類(lèi)型使用同一種算法,可使用模板,有時(shí)需要像重載常規(guī)函數(shù)那樣去重載函數(shù)模板。

void swap(Any &a, Any &b);
void swap(int &a, int &b);

假設(shè):

struct job
{ 
char name[10];
int floor;
};

假設(shè)我們希望交換兩個(gè)job結(jié)構(gòu)的內(nèi)容,直接互換job即可,但有時(shí)候我們只想交換name,不交換floor,但函數(shù)的參數(shù)列表是一樣的,無(wú)法使用模板重載來(lái)提提供其他的代碼,此時(shí)需要涉及到具體化函數(shù)的定義,即指定某個(gè)函數(shù)定義,不再匹配模板。

實(shí)例化和具體化

在代碼中包模板本身不會(huì)生成函數(shù)定義,編譯器會(huì)根據(jù)具體參數(shù)類(lèi)型生成模板的具體實(shí)例,這種叫隱式實(shí)例化。如今C++允許顯示實(shí)例化,意味著直接命令編輯器創(chuàng)建特定的實(shí)例,語(yǔ)法是在函數(shù)聲明前加template:

template void swap<int>(int &, int &); 

此外還可以顯示具體化(一下二者等價(jià))

template <> void swap<int>(int &, int &); 
template <> void swap(int &a, int &b);

隱式實(shí)例化,顯示實(shí)例化和具體實(shí)例化統(tǒng)稱(chēng)具體化,都表示使用具體的函數(shù)定義,而不是通用描述。再聲明中使用前綴template和template<>來(lái)區(qū)分顯示實(shí)例化和具體化。顯示具體化必須有自己的定義,實(shí)例化不需要有自己的定義。
警告:試圖在同一個(gè)編程單元中使用同一類(lèi)型的顯示實(shí)例和顯示具體化將出錯(cuò)。
#具體化函數(shù)將覆蓋常規(guī)函數(shù),而非模板函數(shù)將覆蓋具體化和常規(guī)模板!

編譯器的選擇

編譯器通常會(huì)對(duì)參數(shù)進(jìn)行所需要的轉(zhuǎn)換,選擇是從最佳到最差的順序如下:

  1. 完全匹配,但常規(guī)函數(shù)優(yōu)于模板。(兩個(gè)完全匹配的模板,較具體的優(yōu)先,顯示具體化優(yōu)于隱式)
  2. 提升轉(zhuǎn)換(例如:char和shorts轉(zhuǎn)int,floor自動(dòng)轉(zhuǎn)double)
  3. 標(biāo)準(zhǔn)轉(zhuǎn)換(例如: int轉(zhuǎn)char)
  4. 用戶(hù)自定義轉(zhuǎn)換
template <class Type> void f(Type T);   //#1
template <class Type> void f(Type *T);  //#2
struct blot {int a, char b[10];};
blot link = {25, "sport");
f(&link);

f(&link)與#1,#2都匹配,具體參照完全匹配,但是#2更具體,#1還需要將轉(zhuǎn)換為指針,因?yàn)閰?shù)不需要再轉(zhuǎn)換已經(jīng)具體化為指針了。

完全匹配允許的無(wú)關(guān)緊要轉(zhuǎn)換

輸入圖片說(shuō)明
輸入圖片說(shuō)明
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,671評(píng)論 1 51
  • C++ 模板簡(jiǎn)介 一、模板 使用模板的目的就是能夠讓程序員編寫(xiě)與類(lèi)型無(wú)關(guān)的代碼。 模板是一種對(duì)類(lèi)型進(jìn)行參數(shù)化的工具...
    MinoyJet閱讀 2,524評(píng)論 0 12
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139

友情鏈接更多精彩內(nèi)容