【C++模板】特化與偏特化 template [partial] specialization

 

1 template specialization 模板特化

一般情況下類模板定義如下:

template<class Window, class Controller>
class Widget
{
    ... 泛化實現代碼 ...
};
特化是指把類模板中指定的class T變成具體的類型:

class Widget<ModalDialog, MyController>
{
    ... 特化實現代碼 ...
};
其中ModalDialog和MyController是你自己另外定義的類.
有了這個Widget的特化定義之後,如果你以後定義了Widget<ModalDialog, MyController>對象時,編譯器就會使用上述的特化定義.
如果定義了其它泛型對象,那麼編譯器就是用原本的泛化定義.
這就是模板的特化.

2 template partial specialization 模板偏特化

模板特化是通過"給模板中的所有模板參數一個具體的類"的方式來實現的.而模板偏特化則是通過"給模板中的部分模板參數以具體的類,而留下剩餘的模板參數仍然使用原來的泛化定義"的方式來實現的.

template<class Window>                        //仍然使用原來的泛化定義;
class Widget<Window, MyController>            //MyController是具體的類,是特化定義;
{
    ... 偏特化實現代碼 ...
};
模板的偏特化能力很強大.當你實例化一個模板時,編譯器會把目前存在的偏特化模板和全特化模板做比較,並找出其中最合適、最匹配的實現.
這樣,靈活性就很大.
模板的偏特化機制不能用在函數身上,不論成員函數還是非成員函數.

3 注意

  1. 雖然你可以全特化類模板中的成員函數,但是你不能偏特化他們;
  2. 你不能偏特化命名空間級別(namespace-level)的函數(non-member).最接近"命名空間級別模板函數"的偏特化機制就是函數重載,那就意味着你對"函數參數"(而非返回值類型或內部所用類型)有很精緻的特化能力;
  3. 特化或全特化時,template後面的尖括號中不帶任何內容;

Author: visaya fan <visayafan[AT]gmail.com or visayafan[AT]163.com>

Date: 2011-10-21 17:30:04

HTML generated by org-mode 6.33x in emacs 23

發佈了15 篇原創文章 · 獲贊 8 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章