久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

2.11 模板函數(shù)的默認(rèn)模板參數(shù)

 wangcqqj123 2017-02-13

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

  1. #include <iostream> 
  2. using namespace std;  
  3.  
  4. // 定義一個(gè)函數(shù)模板  
  5. template <typename T> void TempFun(T a) {  
  6.     cout << a << endl;  
  7. }  
  8.  
  9. int main() {  
  10.     TempFun(1);     // 1, (實(shí)例化為T(mén)empFun<const int>(1))  
  11.     TempFun('1');   // 1, (實(shí)例化為T(mén)empFun<const char *>('1'))  
  12. }  
  13. // 編譯選項(xiàng):g++ 2-11-1.cpp  
  14.  

在代碼清單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(int),,再進(jìn)行調(diào)用,。相應(yīng)的,對(duì)于fun('1')來(lái)說(shuō)也是類(lèi)似的,,不過(guò)編譯器實(shí)例化出的模板函數(shù)的參數(shù)的類(lèi)型將是const char *,。

函數(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

  1. void DefParm(int m = 3) {}  // c++98編譯通過(guò),c++11編譯通過(guò)  
  2. template <typename T = int> 
  3.     class DefClass {};      // c++98編譯通過(guò),,c++11編譯通過(guò)  
  4. template <typename T = int> 
  5.     void DefTempParm() {};  // c++98編譯失敗,,c++11編譯通過(guò)  
  6. // 編譯選項(xiàng):g++ -c -std=c++11 2-11-1.cpp  
  7.  

可以看到,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

  1. template<typename T1, typename T2 = int> class DefClass1;  
  2. template<typename T1 = int, typename T2> class DefClass2;   // 無(wú)法通過(guò)編譯  
  3.  
  4. template<typename T, int i = 0> class DefClass3;  
  5. template<int i = 0, typename T> class DefClass4;            // 無(wú)法通過(guò)編譯  
  6.  
  7. template<typename T1 = int, typename T2> void DefFunc1(T1 a, T2 b);  
  8. template<int i = 0, typename T> void DefFunc2(T a);  
  9. // 編譯選項(xiàng):g++ -c -std=c++11 2-11-2.cpp  
  10.  

從代碼清單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

  1. template <class T, class U = double> 
  2. void f(T t = 0, U u = 0);  
  3.  
  4. void g() {  
  5.     f(1, 'c');      // f<int,char>(1,'c')  
  6.     f(1);           // f<int,double>(1,0), 使用了默認(rèn)模板參數(shù)double  
  7.     f();            // 錯(cuò)誤: T無(wú)法被推導(dǎo)出來(lái)  
  8.     f<int>();       // f<int,double>(0,0), 使用了默認(rèn)模板參數(shù)double  
  9.     f<int,char>();  // f<int,char>(0,0)  
  10. }  
  11. // 編譯選項(xiàng):g++ -std=c++11 2-11-3.cpp  
  12.  

在代碼清單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(1,0),其中,,第二個(gè)類(lèi)型參數(shù)U使用了默認(rèn)的模板類(lèi)型參數(shù)double,而函數(shù)實(shí)參則為默認(rèn)值0,。類(lèi)似地,, f()實(shí)例化出的模板函數(shù)第二參數(shù)類(lèi)型為double,值為0,。而表達(dá)式f()由于第一類(lèi)型參數(shù)T的無(wú)法推導(dǎo),,從而導(dǎo)致了編譯的失敗。而通過(guò)這個(gè)例子我們也可以看到,,默認(rèn)模板參數(shù)通常是需要跟默認(rèn)函數(shù)參數(shù)一起使用的,。

還有一點(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】

回書(shū)目   上一節(jié)   下一節(jié)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多