閱讀916 返回首頁    go 技術社區[雲棲]


C++―全特化和偏特化

全特化和偏特化

C++中的模板分為類模板和函數模板,雖然它引進到C++標準中的時間不是很長,但是卻得到了廣泛的應用,

這一點在STL中有著充分的體現。目前,STL在C++社區中得到了廣泛的關注、應用和研究。理解和掌握模板

學習、應用和研究以及擴充STL的基礎。而STL模板實例中又充斥著大量的模板特化和偏特化。

模板特化分為兩種:

全特化和偏特化

首先我們得先明白一個問題,為什麼會有特化這種東西呢?

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

全特化:

那我們就用一個例子開始吧:

[cpp] view plain copy

  1. template<class T>

  2. class A

  3. {

  4. public:

  5. A()

  6. :a(0)

  7. {}

  8. ~A()

  9. {

  10. cout << "這裏走了原始的模板"<< endl;

  11. }

  12. protected:

  13. T a;

  14. };

  15. template<>

  16. class A<int>

  17. {

  18. public:

  19. A()

  20. :a(0)

  21. {}

  22. ~A()

  23. {

  24. cout << "這裏走了全特化後int的版本" << endl;

  25. }

  26. protected:

  27. int a;

  28. };

  29. void test2()

  30. {

  31. A<char> a;

  32. A<int> b;

  33. }

我們先看看程序運行的結果:

C++全特化和偏特化

我們通過析構函數發現了,A<int> b 走的是我們特化的版本。 而A<char> a走的是原始版本。

這就是全特化,我們對模板的所有參數進行了特化。如果你想學習C/C++可以來這個群,首先是三三零,中間是八五九,最後是七六六,裏麵有大量的學習資料可以下載。

下麵是我調試時實例化b的時候,發生的事情,程序走的是int類型特化版本,有圖有真相:

C++全特化和偏特化

偏特化:

所謂的偏特化也稱局部特化,大家大概明白什麼回事了吧。 全特化是所有的模板參數都被進行特化

,偏特化也就是局部的參數特化,看看下麵這個例子吧:

[cpp]?view plain copy print?

  1. template <typename T1, typename T2>

  2. class Data

  3. {

  4. public:

  5. Data();

  6. private:

  7. T1 _d1;

  8. T2 _d2;

  9. };

  10. template <typename T1, typename T2>

  11. Data<T1, T2>::Data()

  12. {

  13. cout << "Data<T1, T2>" << endl;

  14. }

  15. // 局部特化第二個參數

  16. template <typename T1>

  17. class Data <T1, int>

  18. {

  19. public:

  20. Data();

  21. private:

  22. T1 _d1;

  23. int _d2;

  24. };

  25. template <typename T1>

  26. Data<T1, int>::Data()

  27. {

  28. cout << "Data<T1, int>" << endl;

  29. }

  30. void test2()

  31. {

  32. Data<double, int> d1;

  33. Data<int, double> d2;

  34. }

  35. int main()

  36. {

  37. test2();

  38. system("pause");

  39. return 0;

  40. }

我們觀察輸出的結果:

C++全特化和偏特化

我畫一張圖幫我們理解吧:

C++全特化和偏特化

下麵我再舉個例子,你們說說他是偏特化還是全特化:

[cpp]?view plain copy print?

  1. template <typename T1, typename T2>

  2. class Data <T1*, T2*>

  3. {

  4. public :

  5. Data();

  6. private :

  7. T1 _d1 ;

  8. T2 _d2 ;

  9. T1* _d3 ;

  10. T2* _d4 ;

  11. };

  12. template <typename T1, typename T2>

  13. Data<T1 *, T2*>:: Data()

  14. {

  15. cout<<"Data<T1*, T2*>" <<endl;

  16. }

  17. // 局部特化兩個參數為引用

  18. template <typename T1, typename T2>

  19. class Data <T1&, T2&>

  20. {

  21. public :

  22. Data(const T1& d1, const T2& d2);

  23. private :

  24. const T1 & _d1;

  25. const T2 & _d2;

  26. T1* _d3 ;

  27. T2* _d4 ;

  28. };

  29. template <typename T1, typename T2>

  30. Data<T1 &, T2&>:: Data(const T1& d1, const T2& d2)

  31. : _d1(d1 )

  32. , _d2(d2 )

  33. {

  34. cout<<"Data<T1&, T2&>" <<endl;

  35. }

記住這些都是偏特化,這裏就要再引出一個概念,偏特化並不僅僅是指特殊部分參數,而是針對模板參數更

進一步的條件限製所設計出來的一個特化版本。

最後我在說一個注意事項: 模板的全特化和偏特化都是在已經定義的模板基礎之上的,不能單獨存在。

最後更新:2017-05-10 16:31:20

  上一篇:go 福利福利@五月份,日誌易感恩SaaS用戶,活動開啟!
  下一篇:go DT科技評論第38期:中國打造全球首個光量子模擬機&穀歌地圖用深度學習實時更新街景