模版的特化與偏特化

2021-05-28 00:00:27 字數 1580 閱讀 9465

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後面的尖括號中不帶任何內容;

模板偏特化是指只給部分模板引數乙個具體的型別,來實現這個模板;

模版的完全特化與偏特化

模版特化 任何針對模版引數進一步進行條件限制設計的特化版本。泛型思維 完全特化 針對所有的模版引數進行特化。舉例如下 templateclass template 全特化 template class template 偏特化 templateclass template 注意 函式模版不存在偏特化...

模版的特化和偏特化

模版的特化與偏特化 模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你能對某一功能更好的實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是如果這個模板有多個型別,那麼只限定其中的一部分。partial template spe...

05模版的全特化與偏特化

編譯器認為,對於特定的型別,如果你能對某一功能更好的實現,那麼就該聽你的。全特化將模板中模板引數全部指定為確定的型別。類全特化 template classt1,class t2 class atemplate class a intfloat 簡單案例 include 類全特化 template ...