程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 模版的特化與偏特化

模版的特化與偏特化

編輯:C++入門知識

 Partial Template Specialization能夠讓你在模板(Template)的所有可能的實體中特化出一組子集.   1.模板的特化(template specialization):     例如,定義如下的一個模板:     template<class Window, class Controller>     class Widget     {       ... 泛化實現代碼 ...     };     然後你可以像下面那樣明確地加以特化:     template<>    //注意:template後面的尖括號中不帶任何內容;     class Widget<ModalDialog, MyController>     {       ... 特化實現代碼 ...     };     其中ModalDialog和MyController是你自己另外定義的類;有了這個Widget的特化定義之後,如果你以後定義了Widget<ModalDialog, MyController>對象時,編譯器就會使用上述的特化定義,如果定義了其它泛型對象,那麼編譯器就是用原本的泛化定義;這就是模板的特化.     2.Partial Template Specialization(模板偏特化)     模板特化是通過"給模板中的所有模板參數一個具體的類"的方式來實現的.而模板偏特化則是通過"給模板中的部分模板參數以具體的類,而留下剩余的模板參數仍然使用原來的泛化定義"的方式來實現的;     比如,就上面的Widget類模板的定義來說,有時候想針對任意的Window來搭配一個特定的MyController類特化Widget,這個時候就需要使用模板偏特化機制了.下面的Widget類模板就是Widget的偏特化定義:     template<class Window>                        //仍然使用原來的泛化定義;     class Widget<Window, MyController>            //MyController是具體的類,是特化定義;     {       ... 偏特化實現代碼 ...     };     這就是一個偏特化定義;一個MyController類可以搭配任意一種Window.     通常在一個類模板的偏特化定義中,你只會特化某些模板參數而留下其它泛化參數.當你在程序中具體實現上述類模板的時,編譯器會試著找出最匹配的模板定義.這個尋找過程十分復雜精細,允許你以富有創意的方式來進行偏特化.例如,假設你有一個Button類模板,它有一個模板參數,那麼,你不但可以拿任意的Window搭配特定的MyController來特化Widget,還可以拿任意Button搭配特定的MyController來偏特化Widget:     template<class ButtonArg>    www.2cto.com     class Widget<Button<ButtonArg>, MyController>    //使用任意Button搭配具體的類MyContorller     {       ... 偏特化實現代碼 ...     };     模板的偏特化能力很強大.當你實例化一個模板時,編譯器會把目前存在的偏特化模板和全特化模板做比較,並找出其中最合適、最匹配的實現.這樣,靈活性就很大.但是不幸的是,模板的偏特化機制不能用在函數身上,不論成員函數還是非成員函數.     注意:   1.雖然你可以全特化類模板中的成員函數,但是你不能偏特化他們;   2.你不能偏特化命名空間級別(namespace-level)的函數(non-member).最接近"命名空間級別模板函數"的偏特化機制就是函數重載,那就意味著你對"函數參數"(而非返回值類型或內部所用類型)有很精致的特化能力;   3.特化或全特化時,template後面的尖括號中不帶任何內容;     總結:   模板特化/全特化是指給每一個模板參數一個具體的類型,以具體實現這個模板,而且template後面的尖括號中不帶任何內容;   模板偏特化是指只給部分模板參數一個具體的類型,來實現這個模板;  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved