特化和偏特化 特化和偏特化

2021-08-26 19:48:05 字數 3214 閱讀 5387

分類:c++

2010-03-17 18:27

560人閱讀

收藏 舉報

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

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

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

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

模板的特化(特化和偏特化)

模板特化可以分為全特化和偏特化 特化可以為類增加成員函式或成員變數 模板特化有三種型別,一是特化為絕對型別,二是特化為引用 指標型別,三是特化為另外乙個模板類 include include include usingnamespacestd template classt tmaxr tt1,tt...

特化與偏特化

綜合stl 原始碼剖析中給出的兩種定義,可以如下定義 所謂偏特化的意思是提供另乙份更進一步條件的template定義式,其仍然是模板化的。舉乙個例子 templatestruct test 偏特化版本1 templatestruct test 偏特化版本2 templatestruct test t...

模版的特化和偏特化

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