模版的特化與偏特化
模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你能對某一功能更好的實現,那麼就該聽你的。
模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是如果這個模板有多個型別,那麼只限定其中的一部分。
partial template specialization能夠讓你在模板(template)的所有可能的實體中特化出一組子集.
1.模板的特化(template specialization)
:
例如,定義如下的乙個模板:
template
class widget
;然後你可以像下面那樣明確地加以特化:
template<> //注意:template後面的尖括號中不帶任何內容;
class widget
;其中modaldialog和mycontroller是你自己另外定義的類;有了這個widget的特化定義之後,如果你以後定義了widget物件時,編譯器就會使用上述的特化定義,如果定義了其它泛型物件,那麼編譯器就是用原本的泛化定義;這就是模板的特化.
2.partial template specialization(模板偏特化)
模板特化是通過"給模板中的所有模板引數乙個具體的類"的方式來實現的.而模板偏特化則是通過"給模板中的部分模板引數以具體的類,而留下剩餘的模板引數仍然使用原來的泛化定義"的方式來實現的;
比如,就上面的widget類模板的定義來說,有時候想針對任意的window來搭配乙個特定的mycontroller類特化widget,這個時候就需要使用模板偏特化機制了.下面的widget類模板就是widget的偏特化定義:
template//仍然使用原來的泛化定義;
class widget//mycontroller是具體的類,是特化定義;
;這就是乙個偏特化定義;乙個mycontroller類可以搭配任意一種window.
通常在乙個類模板的偏特化定義中,你只會特化某些模板引數而留下其它泛化引數.當你在程式中具體實現上述類模板的時,編譯器會試著找出最匹配的模板定義.這個尋找過程十分複雜精細,允許你以富有創意的方式來進行偏特化.例如,假設你有乙個button類模板,它有乙個模板引數,那麼,你不但可以拿任意的window搭配特定的mycontroller來特化widget,還可以拿任意button搭配特定的mycontroller來偏特化widget:
template
class widget, mycontroller> //使用任意button搭配具體的類mycontorller
;模板的偏特化能力很強大.當你例項化乙個模板時,編譯器會把目前存在的偏特化模板和全特化模板做比較,並找出其中最合適、最匹配的實現.這樣,靈活性就很大.但是不幸的是,模板的偏特化機制不能用在函式身上,不論成員函式還是非成員函式.
注意:1.雖然你可以全特化類模板中的成員函式,但是你不能偏特化他們;
2.你不能偏特化命名空間級別(namespace-level)的函式(non-member).最接近"命名空間級別模板函式"的偏特化機制就是函式過載,那就意味著你對"函式引數"(而非返回值型別或內部所用型別)有很精緻的特化能力;
3.特化或全特化時,template後面的尖括號中不帶任何內容;
總結:模板特化/全特化是指給每乙個模板引數乙個具體的型別,以具體實現這個模板,而且template後面的尖括號中不帶任何內容;
模板偏特化是指只給部分模板引數乙個具體的型別,來實現這個模板;
特化和偏特化 特化和偏特化
分類 c 2010 03 17 18 27 560人閱讀 收藏 舉報 partial template specialization能夠讓你在模板 template 的所有可能的實體中特化出一組子集.1.模板的特化 template specialization 例如,定義如下的乙個模板 templ...
模版的特化與偏特化
partial template specialization能夠讓你在模板 template 的所有可能的實體中特化出一組子集.1.模板的特化 template specialization 例如,定義如下的乙個模板 template class widget 然後你可以像下面那樣明確地加以特化 ...
模版的完全特化與偏特化
模版特化 任何針對模版引數進一步進行條件限制設計的特化版本。泛型思維 完全特化 針對所有的模版引數進行特化。舉例如下 templateclass template 全特化 template class template 偏特化 templateclass template 注意 函式模版不存在偏特化...