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 注意
- 雖然你可以全特化類模板中的成員函數,但是你不能偏特化他們;
- 你不能偏特化命名空間級別(namespace-level)的函數(non-member).最接近"命名空間級別模板函數"的偏特化機制就是函數重載,那就意味着你對"函數參數"(而非返回值類型或內部所用類型)有很精緻的特化能力;
- 特化或全特化時,template後面的尖括號中不帶任何內容;
Date: 2011-10-21 17:30:04
HTML generated by org-mode 6.33x in emacs 23