2.11 模板函數(shù)的默認(rèn)模板參數(shù) 類(lèi)別:所有人 在C++11中模板和函數(shù)一樣,可以有默認(rèn)的參數(shù),。這就帶來(lái)了一定的復(fù)雜性,。我可以通過(guò)代碼清單2-26所示的這個(gè)簡(jiǎn)單的模板函數(shù)的例子來(lái)回顧一下函數(shù)模板的定義。 代碼清單2-26
在代碼清單2-26中,,當(dāng)編譯器解析到函數(shù)調(diào)用fun(1)的時(shí)候,,發(fā)現(xiàn)fun是一個(gè)函數(shù)模板。這時(shí)候編譯器就會(huì)根據(jù)實(shí)參1的類(lèi)型const int推導(dǎo)實(shí)例化出模板函數(shù)void TempFun 函數(shù)模板在C++98中與類(lèi)模板一起被引入,,不過(guò)在模板類(lèi)聲明的時(shí)候,標(biāo)準(zhǔn)允許其有默認(rèn)模板參數(shù),。默認(rèn)的模板參數(shù)的作用好比函數(shù)的默認(rèn)形參,。然而由于種種原因,C++98標(biāo)準(zhǔn)卻不支持函數(shù)模板的默認(rèn)模板參數(shù),。不過(guò)在C++11中,,這一限制已經(jīng)被解除了,我們可以看看下面這個(gè)例子,,如代碼清單2-27所示,。 代碼清單2-27
可以看到,DefTempParm函數(shù)模板擁有一個(gè)默認(rèn)參數(shù),。使用僅支持C++98的編譯器編譯,,DefTempParm的編譯會(huì)失敗,而支持C++11的編譯器則毫無(wú)問(wèn)題,。不過(guò)在語(yǔ)法上,,與類(lèi)模板有些不同的是,在為多個(gè)默認(rèn)模板參數(shù)聲明指定默認(rèn)值的時(shí)候,,程序員必須遵照“從右往左”的規(guī)則進(jìn)行指定,。而這個(gè)條件對(duì)函數(shù)模板來(lái)說(shuō)并不是必須的,如代碼清單2-28所示,。 代碼清單2-28
從代碼清單2-28中可以看到,,不按照從右往左定義默認(rèn)類(lèi)模板參數(shù)的模板類(lèi)DefClass2和DefClass4都無(wú)法通過(guò)編譯。而對(duì)于函數(shù)模板來(lái)說(shuō),,默認(rèn)模板參數(shù)的位置則比較隨意,。可以看到DefFunc1和DefFunc2都為第一個(gè)模板參數(shù)定義了默認(rèn)參數(shù),,而第二個(gè)模板參數(shù)的默認(rèn)值并沒(méi)有定義,,C++11編譯器卻認(rèn)為沒(méi)有問(wèn)題。 函數(shù)模板的參數(shù)推導(dǎo)規(guī)則也并不復(fù)雜,。簡(jiǎn)單地講,,如果能夠從函數(shù)實(shí)參中推導(dǎo)出類(lèi)型的話,那么默認(rèn)模板參數(shù)就不會(huì)被使用,,反之,,默認(rèn)模板參數(shù)則可能會(huì)被使用。我們可以看看下面這個(gè)來(lái)自于C++11標(biāo)準(zhǔn)草案的例子,,如代碼清單2-29所示,。 代碼清單2-29
在代碼清單2-29中,,我們定義了一個(gè)函數(shù)模板f,f同時(shí)使用了默認(rèn)模板參數(shù)和默認(rèn)函數(shù)參數(shù),??梢钥吹剑捎诤瘮?shù)的模板參數(shù)可以由函數(shù)的實(shí)參推導(dǎo)而出,,所以在f(1)這個(gè)函數(shù)調(diào)用中,,我們實(shí)例化出了模板函數(shù)的調(diào)用應(yīng)該為f 還有一點(diǎn)應(yīng)該強(qiáng)調(diào)一下,模板函數(shù)的默認(rèn)形參不是模板參數(shù)推導(dǎo)的依據(jù),。函數(shù)模板參數(shù)的選擇,,總是由函數(shù)的實(shí)參推導(dǎo)而來(lái)的,這點(diǎn)讀者在使用中應(yīng)當(dāng)注意,。 【責(zé)任編輯:book TEL:(010)68476606】
|
|
來(lái)自: wangcqqj123 > 《template》