C++11新特性之變長(zhǎng)參數(shù)模板詳解_第1頁
C++11新特性之變長(zhǎng)參數(shù)模板詳解_第2頁
C++11新特性之變長(zhǎng)參數(shù)模板詳解_第3頁
C++11新特性之變長(zhǎng)參數(shù)模板詳解_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C++11新特性之變長(zhǎng)參數(shù)模板詳解在C++11之前,無論是類模板還是函數(shù)模板,都只能按其指定的樣子,接受一組固定數(shù)量的模板參數(shù);

這已經(jīng)大大提升了代碼的復(fù)用!

在C++11之后,加入了新的表示方法,允許任意個(gè)數(shù)、任意類別的模板參數(shù),同時(shí)也不需要在定義時(shí)將參數(shù)的個(gè)數(shù)固定。更加像”黑魔法“了。

templatetypename...TsclassMagic;

模板類Magic的對(duì)象,能夠接受不受限制個(gè)數(shù)的typename作為模板的形式參數(shù),例如下面的定義:

classMagicint,

std::vectorint,

std::mapstd::string,

std::vectorintdarkMagic;

既然是任意形式,所以個(gè)數(shù)為0的模板參數(shù)也是可以的:classMagicnothing;。如果不希望產(chǎn)生的模板參數(shù)個(gè)數(shù)為0,可以手動(dòng)的定義至少一個(gè)模板參數(shù):

templatetypenameRequire,typename...ArgsclassMagic;

變長(zhǎng)函數(shù)參數(shù)包

除了在模板參數(shù)中能使用...表示不定長(zhǎng)模板參數(shù)外,函數(shù)參數(shù)也使用同樣的表示法代表不定長(zhǎng)參數(shù)。

傳統(tǒng)C中的printf函數(shù),雖然也能達(dá)成不定個(gè)數(shù)的形參的調(diào)用,但其并非類別安全。而C++11除了能定義類別安全的變長(zhǎng)參數(shù)函數(shù)外,還可以使類似printf的函數(shù)能自然地處理非自帶類別的對(duì)象。除了在模板參數(shù)中能使用...表示不定長(zhǎng)模板參數(shù)外,函數(shù)參數(shù)也使用同樣的表示法代表不定長(zhǎng)參數(shù),這也就為我們簡(jiǎn)單編寫變長(zhǎng)參數(shù)函數(shù)提供了便捷的手段,例如:

templatetypename...Args

voidprintf(conststd::stringstr,Args...args);

其中,Args與args分別代表模板與函數(shù)的變長(zhǎng)參數(shù)集合,稱之為參數(shù)包(parameterpack)。參數(shù)包必須要和運(yùn)算符"..."搭配使用。

如何解參數(shù)包

長(zhǎng)參數(shù)模板中,變長(zhǎng)參數(shù)包無法如同一般參數(shù)在類或函數(shù)中使用;這個(gè)很好理解!

因?yàn)樵跅V?,我們需要先知道函?shù)有多少個(gè)參數(shù),才可以入棧,但是我們不知道變長(zhǎng)參數(shù)有多長(zhǎng),所以需要特殊手法!

sizeof()獲得函數(shù)參數(shù)個(gè)數(shù)

首先,我們可以使用sizeof...來計(jì)算參數(shù)的個(gè)數(shù),:

templatetypename...Ts

voidmagic(Ts...args)

std::coutsizeof...(args)std::endl;

遞歸模板函數(shù)

遞歸去獲得所有參數(shù),是非常容易想到的方法,這種方法不斷遞歸地向函數(shù)傳遞模板參數(shù),進(jìn)而達(dá)到遞歸遍歷所有模板參數(shù)的目的。

printf會(huì)不斷地遞歸調(diào)用自身:函數(shù)參數(shù)包args...在調(diào)用時(shí),會(huì)被模板類別匹配分離為Tvalue和Args...args。直到args...變?yōu)榭諈?shù),則會(huì)與簡(jiǎn)單的printf(constchar*s)形成匹配,退出遞歸。

//遞歸模板函數(shù)

templatetypenameT0

voidprintf1(T0value)

std::coutvaluestd::endl;

templatetypenameT,typename...Ts

voidprintf1(Tvalue,Ts...args)

std::coutvaluestd::endl;

printf1(args...);

intRecursiveTemplateFunc()

printf1(1,2,"123",1.1);

return0;

變參模板展開

上面的遞歸很容易理解,但是比較繁瑣,那么還有沒有什么好方法呢?

在C++17中增加了變參模板展開的支持,于是你可以在一個(gè)函數(shù)中完成printf的編寫:

//變參模板展開

templatetypenameT0,typename...T

voidprintf2(T0t0,T...t)

std::coutt0std::endl;

ifconstexpr(sizeof...(t)0)

printf2(t...);

結(jié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論