下載本文檔
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 制造業(yè)質(zhì)量控制關(guān)鍵工序保證措施
- 安全生產(chǎn)管理機(jī)構(gòu)設(shè)置及職責(zé)說明范本
- 高中英語必修課程同步練習(xí)題集
- 物業(yè)管理服務(wù)規(guī)范與操作手冊(cè)
- 計(jì)算機(jī)競(jìng)賽復(fù)賽總結(jié)與經(jīng)驗(yàn)分享
- 跨境電商客戶售后服務(wù)處理指南
- 藍(lán)光輻射與光老化關(guān)系研究-洞察及研究
- 高三復(fù)習(xí)資料整合與時(shí)間規(guī)劃建議
- 幼兒園教室日常消毒操作規(guī)范
- 非人靈長(zhǎng)類神經(jīng)系統(tǒng)研究-洞察及研究
- 2024年河南農(nóng)業(yè)大學(xué)輔導(dǎo)員考試真題
- 2026年九江職業(yè)大學(xué)單招職業(yè)適應(yīng)性考試題庫帶答案解析
- 天車設(shè)備使用協(xié)議書
- 發(fā)泡混凝土地面防滑施工方案
- 產(chǎn)教融合項(xiàng)目匯報(bào)
- 2025-2026學(xué)年湖北省襄陽市襄城區(qū)襄陽市第四中學(xué)高一上學(xué)期9月月考英語試題
- 蘇少版(五線譜)(2024)八年級(jí)上冊(cè)音樂全冊(cè)教案
- 江蘇省城鎮(zhèn)供水管道清洗工程估價(jià)表及工程量計(jì)算標(biāo)準(zhǔn) 2025
- 2025年國家能源局公務(wù)員面試備考指南及模擬題集
- 醫(yī)院感控人員理論知識(shí)考核試題及答案
- 2025遼寧鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握锌荚囄幕刭|(zhì)數(shù)學(xué)練習(xí)題及參考答案詳解(完整版)
評(píng)論
0/150
提交評(píng)論