class templates 的特化(specializations)
你可以針對某些特殊的模板引數,對乙個類模板進行特化。類模板的特化與函式模板的過載類似,使你得以針對某些特定型別進行**優化,或修正某個特定型別在函式模板具現化中的錯誤行為。
然而如果你對乙個類模板進行特化,就必須特化其所有成元函式。雖然你可以特化某個單獨的成員函式,但一旦這麼做,也就不再是特化整個 class template。
欲特化某個 class template,必須以 template<> 開頭申明此類,後面跟著你希望的特化結果。特化型別將作為模板引數 並在 class 稱之後直接寫明:
template<>
class stack;
對特化體而言,每個成員函式都必須像常規的成員函式那樣定義,每乙個 t 出現處都必須更換為特化型別:
void stack::push (std::string const& elem)
下面是乙個針對 std::string 型別而特化的 stack<> 的完整範例:
#include
#include
#include
#include "stack1.hpp"
template<>
class stack };
void stack::push (std::string const& elem)
void stack::pop ()
elems.pop_back(); // 移除最後㆒個元素}
std::string stack::top () const
return elems.back(); // 傳回最後㆒個元素的拷貝 }
偏特化:
class templates可以被偏特化(或稱部份特化、區域性特化)。這使你得以在特定情形下使用特殊實現碼,但仍然留給你選擇 template parameters 的能力。
例如對於下面的 class template:
template
class myclass ;
以下數種形式的偏特化都是合理的:
// 偏特化:兩個 template parameter 相同
template
class myclass;
// 偏特化:第二個型別為 int
template
class myclass;
// 偏特化:兩個 template parameter 均為指標型別
template
class myclass;
以下例子示範,下列各式使用上述哪乙個 class template:
myclassmif; // 使用 myclass
myclassmff; // 使用 myclass
myclassmfi; // 使用 myclass
myclassmp; // 使用 myclass
如果某個宣告式與兩個(或更多)偏特化版本產生同等的匹配程度,這個宣告式便被視為模稜兩可(歧義):
myclassm; // 錯誤:同時匹配 myclass和 myclass
myclassm; // 錯誤:同時匹配 myclass和 myclass
為解除上述第二宣告的歧義性,你可以針對「指向相同型別」的指標,提供另㆒個偏特化版本:
template
class myclass;
模板的特化(特化和偏特化)
模板特化可以分為全特化和偏特化 特化可以為類增加成員函式或成員變數 模板特化有三種型別,一是特化為絕對型別,二是特化為引用 指標型別,三是特化為另外乙個模板類 include include include usingnamespacestd template classt tmaxr tt1,tt...
C 模板特化 偏特化
注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...
c 模板特化偏特化
模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你對某一功能有更好地實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是模板如果有多個型別,那麼就只限定為其中的 一部分,其實特化細分為範圍上的偏特化與個數上的偏特化。模板的泛化 ...