類模板的部分特例化

2021-09-13 12:59:16 字數 1288 閱讀 6854

「針對模板引數更進一步的條件限制所設計出來的乙個特化版本」 (摘自《泛型思維》)

//原始的,最通用版本,允許接收t為任何型別

templateclass c ;

//部分特例化,此版本僅適用於指標型別

templateclass c;

注:只有類模板才支援部分特例化,函式模板特例化時必須為原模板中每個模板引數都提供實參。

類模板的部分特例化版本在本質上還是乙個模板

當我們定義類模板的部分特例化版本時,我們首先定義模板引數(就是template<>中的內容)。特例化版本的模板引數只包含原模板中那些還未確定型別的模板引數。

在類名之後的<>中,我們要為特例化的模板引數指定實參。(注意:這些實參與原模板中的引數按位置對應)

例如:

//general template

templateclass pair ;

//specialization with t2 set to int

templateclass pair;

上述第二個宣告將t2具體化為int,但t1保持不變。

到此,你可能會對文章開始的那個例子感到困惑,在那個例子中特例化版本的模板引數的數目與原始模板相同,怎麼叫部分特例化?

其實,部分特例化版本的模板引數列表是原始模板引數列表的乙個子集或者是乙個特例化版本。在第乙個例子中,就是使用指標提供特殊版本來部分例項化現有的模板。

對於class c:

cc1;		//use general c template, t is char

cc2; //use cpartial specialization, t is char

對於class pair:

pairp1;	//use general pair template

pairp2; //use pairpartial specialization

注:如果有多個模板可供選擇,編譯器將使用特例化程度最高的模板。

如果我們對所有的模板引數指定型別,則<>內將為空,這將導致全特例化版本,又叫顯示特例化(explicit specialization)。

例如:

//specialization with t1 and t2 set to int

template<>

class pair;

//use pairexplicit specialization

pairp3;

模板類,模板類函式特例化,模板類特例化

今天在看某c 框架原始碼時,發現模板類裡的部分函式可以特例化,感覺很神奇便嘗試了下,發現很多平時不會注意的c 細節及知識,寫下來分享給大家,以便大家遇到相似問題時可以少踩點坑。模板類會出現鏈結問題,編譯不通過 如果模板類.h檔案和.cpp檔案分開存放,然後編譯的時候會提示鏈結錯誤,無法生產exe檔案...

模板特例化 過載

名詞解釋 靜多型 靜多型 static polymorphism 是多型性的一種,繫結發生在編譯期 compile time 稱為靜態繫結static binding 非引數化多型和引數化多型並不衝突,而且相輔相成,它們混合使用能夠帶來更大的靈活性,函式模板 過載就是很好的例子。include in...

模板類的特例定義

opencv中有乙個模板類datatype,該函式定義如下 該類有自己的模板 tp,但是如果有某乙個型別需要與這個類的內部定義有區別怎麼辦,可以重新將該型別下的類進行再次定義 另外,對於模板類,如果對應的某個特例型別下,有某個函式需要與預設函式不一致,也可以自己重新申明,並給出定義 下面給出了其申明...