模板的偏特化

2021-06-05 14:07:58 字數 1612 閱讀 7194

總結

:模板特化/全特

化是指給每乙個模板引數乙個具體的型別,以具體實現這個模板,而且

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...