標籤:

模板的全特化與偏特化

模板的全特化與偏特化 分類: C/C++小知識 2012-09-10 21:37 378人閱讀 評論(0) 收藏 舉報

模板為什麼要特化,因為編譯器認為,對於特定的類型,如果你能對某一功能更好的實現,那麼就該聽你的。

模板分為類模板與函數模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體類型,偏特化就是如果這個模板有多個類型,那麼只限定其中的一部分。

先看類模板:

[cpp] view plaincopy?

  1. template<typenameT1,typenameT2>
  2. classTest
  3. {
  4. public:
  5. Test(T1i,T2j):a(i),b(j){cout<<"模板類"<<endl;}
  6. private:
  7. T1a;
  8. T2b;
  9. };
  10. template<>
  11. classTest<int,char>
  12. {
  13. public:
  14. Test(inti,charj):a(i),b(j){cout<<"全特化"<<endl;}
  15. private:
  16. inta;
  17. charb;
  18. };
  19. template<typenameT2>
  20. classTest<char,T2>
  21. {
  22. public:
  23. Test(chari,T2j):a(i),b(j){cout<<"偏特化"<<endl;}
  24. private:
  25. chara;
  26. T2b;
  27. };

那麼下面3句依次調用類模板、全特化與偏特化:[cpp] view plaincopy?

  1. Test<double,double>t1(0.1,0.2);
  2. Test<int,char>t2(1,"A");
  3. Test<char,bool>t3("A",true);

而對於函數模板,卻只有全特化,不能偏特化:[cpp] view plaincopy?

  1. //模板函數
  2. template<typenameT1,typenameT2>
  3. voidfun(T1a,T2b)
  4. {
  5. cout<<"模板函數"<<endl;
  6. }
  7. //全特化
  8. template<>
  9. voidfun<int,char>(inta,charb)
  10. {
  11. cout<<"全特化"<<endl;
  12. }
  13. //函數不存在偏特化:下面的代碼是錯誤的
  14. /*
  15. template<typenameT2>
  16. voidfun<char,T2>(chara,T2b)
  17. {
  18. cout<<"偏特化"<<endl;
  19. }
  20. */

至於為什麼函數不能偏特化,似乎不是因為語言實現不了,而是因為偏特化的功能可以通過函數的重載完成。分享到:

推薦閱讀:

一組空白精美風景圖文模板
HTML網頁模板
乾貨分享:單招面試自我介紹的通用模板與應答技巧
年終總結怎麼寫?最全攻略看這裡!
打造高顏值PPT的神器!

TAG:模板 |