溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中有哪些函數(shù)模板

發(fā)布時(shí)間:2021-07-05 12:00:18 來源:億速云 閱讀:270 作者:Leah 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(guān)C++中有哪些函數(shù)模板,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

所謂模板,就是模板,但與我們所熟知的模子不同,模板用于生成不同的東西(函數(shù)或者類)。在C++中有函數(shù)模板和類模板。今天我們來探討一下函數(shù)模板。

場景:我們需要一個(gè)函數(shù)來做加法運(yùn)算又或者我們需要自己實(shí)現(xiàn)print函數(shù),那怎么處理傳入?yún)?shù)不同(double ? int ? char ? short ? string ?)的情況呢?

你或許會(huì)脫口而出“函數(shù)重載”,但這意味著你至少要寫兩個(gè)以上的函數(shù)去支持你的參數(shù)類型和個(gè)數(shù)的變化,right?而且這種做法不支持?jǐn)U展,如果有其他的需求,就必須再增加重載函數(shù),這是比較愚蠢的,相信你也這么認(rèn)為。那么,更好的辦法是什么呢?函數(shù)模板。

我們來看例子????

C++中有哪些函數(shù)模板

 1 template <typename T>//先聲明模板參數(shù) T 2 typename T add(const T &num1, const T &num2)//定義模板函數(shù),注意參數(shù)的類型 3 { 4     return num1 + num2; 5 } 6  7 int main() 
 8 { 9     cout << add(1, 3) << endl;//模板的實(shí)例化:int add(const int &num1, const int &num2)10     cout << add(3.0, 9.9) << endl; //實(shí)例化:double add(const double &num1, const double &num2)
11 return 0; 12 }

這樣一來,我們就實(shí)現(xiàn)了一個(gè)模板,多種參數(shù)類型,從這樣說來,模板是優(yōu)于函數(shù)重載的。那么,使用他的時(shí)候,編譯器做了哪些工作呢?

1. 編譯模板本身時(shí), 檢查語法信息;

2. 模板使用時(shí),檢查參數(shù)類型是否匹配,數(shù)目正確與否;

3. 實(shí)例化時(shí),進(jìn)行實(shí)參推斷。

????還記得auto和decltype嗎? 這里的實(shí)參推斷與他們類似。如上面例子中的add(1, 3),我們的實(shí)參就是int型,那么編譯器就會(huì)將int型綁定到我們的模板類型T上,這樣一來,模板就實(shí)例化成了

int add(const int &num1, const int &num2){
  return num1 + num2;
}

好處是,編譯器自己進(jìn)行參數(shù)類型推斷,生成函數(shù)實(shí)例,無需人為參與,也避免了,函數(shù)重載的代碼堆砌。(personal thought)一些我們使用已久的函數(shù)不就是這樣嗎?sort(),find(),reverse()...


 下面我們討論一下,模板的(全)特例化與偏特例化。

【1】全特化

所謂特例化,就是將參數(shù)定死。它本質(zhì)上是模板的一個(gè)特例。比如:

templete <>//標(biāo)識(shí)我們在特例化模板
double add(const double &d1, const double &d2)//參數(shù)類型具體化
{return d1 + d2;
}

這里我們就接管了部分編譯器的工作,如果同時(shí)存在模板和特例化模板, 當(dāng)我們使用模板(參數(shù)與特例化一致),編譯器會(huì)優(yōu)先選擇特例化模板實(shí)例(至少避免了類型推斷不是嗎?)當(dāng)我們有更好更直接的函數(shù)時(shí),要毫不猶豫地使用它。(比如:我們對(duì)傳入?yún)?shù)所知甚少時(shí),就要盡量“包住“所有的可能輸入;而當(dāng)我們明確知道參數(shù)類型和數(shù)量時(shí),就應(yīng)該特化它,提高效率)

【2】偏特化

偏特化是指,特化部分參數(shù)(個(gè)數(shù)特化)或者參數(shù)類型(范圍特化)。

個(gè)數(shù)特化:將幾個(gè)參數(shù)類型具體化

1 template <typename T>2 typename T add(const T &num1, const int &num2)//特化一個(gè)參數(shù) 為int3 {4     return num1 + num2;5 }

范圍特化:將參數(shù)限定在某個(gè)范圍內(nèi)(指針、const ...)

1 template <typename T>2 typename T add(const int num1, const T &num2)//將一個(gè)參數(shù)特化為 const int3 {4     return num1 + num2;5 }
1 template <typename T>2 typename T add(const int* num1, const T &num2)//將一個(gè)參數(shù)特化為 const int* 指針3 {4     return num1 + num2;5 }

至于是否進(jìn)行特例化,就要自己想想了。

1. 某些傳入?yún)?shù)沒有和其他參數(shù)一樣的特性(算術(shù)或者邏輯),我們就需要為它量身定制一個(gè)模板實(shí)例;(就好比add()例子中,要加和string怎么辦?它可是字符數(shù)組呀。)

2. 某些參數(shù)我們是可以確定的,就可以特例化,以期更高的效率(避免類型推導(dǎo)和生成實(shí)例)。


以上就是C++中有哪些函數(shù)模板,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI