總結
:模板特化/全特
化是指給每乙個模板引數乙個具體的型別,以具體實現這個模板,而且
template後面的尖括號中不帶任何內容
;模板偏特化是指只給部分模板引數乙個具體的型別,來實現這個模板;
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後面的尖括號中不帶任何內容;
模板的特化(特化和偏特化)
模板特化可以分為全特化和偏特化 特化可以為類增加成員函式或成員變數 模板特化有三種型別,一是特化為絕對型別,二是特化為引用 指標型別,三是特化為另外乙個模板類 include include include usingnamespacestd template classt tmaxr tt1,tt...
C 模板 模板特化 模板偏特化
模板是c 的乙個重要特性 使用模板 可以極大的減少類似功能 的編寫 這可以看做是c 相較於c的進步 因為這一特性在c中是不容易達到的 語言層面不支援 模板的關鍵字是 template 簡單的模板應用 template class test int main 使用模板的類在例項化時需要指明模板引數型別...
C 模板特化 偏特化
注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...