template
class compare
};int main()
bool isequal(t t1, t t2)
int main()
上述**中,比較字串是否相等,由於傳入的引數是char *型別的,isequal函式模板只是簡單的比較傳入引數的值,即兩個指標是否相等,因此結果為false。顯然,這與我們的初衷不符。因此,上述模板需要對char *型別進行特別處理,即特化。
template <> //告訴編譯器這是乙個特化的模板
class compare //特化(char*)
};注意,如果是在類特化外部定義成員時,成員之前不能加template<>標記。
另外,我們可以只特化成員而不特化類,比如vector中,我們可以只特化push_back操作:
template<>
void vector::push_back(const char *const &val)
類型別vector
template <>
bool isequal(char* t1, char* t2) //函式模板特化
當有多個模板形參時,我們可以只特化一部分形參而不是全部。
c++標準庫中的類vector的定義就是乙個例子:
template
class vector ;
template
class vector ;上述例子中,乙個引數被繫結到bool型別,而另乙個引數仍未繫結需要由使用者指定。
嚴格來說,函式模板並不支援偏特化,但由於可以對函式進行過載,所以可以達到類似於類模板偏特化的效果。
template void f(t); (a)
根據過載規則,對(a)進行過載
template < class t> void f(t*); (b)如果將(a)稱為基模板,那麼(b)稱為對基模板(a)的過載,而非對(a)的偏特化。
最優化的優於次特化的,即模板引數最精確匹配的具有最高的優先權
例子:template class vector; // (a) 普通型
template class vector; // (b) 對指標型別特化
template <> class vector ; // (c) 對void*進行特化每個型別都可以用作普通型(a)的引數,但只有指標型別才能用作(b)的引數,而只有void*才能作為(c)的引數
非模板函式具有最高的優先權。如果不存在匹配的非模板函式的話,那麼最匹配的和最特化的函式具有高優先權
例子:template void f(t); // (d)
template void f(int, t, double); // (e)
template void f(t*); // (f)
template <> void f (int) ; // (g)
void f(double); // (h)
bool b;
int i;
double d;
f(b); // 以 t = bool 呼叫 (d)
f(i,42,d) // 以 t = int 呼叫(e)
f(&i) ; // 以 t = int* 呼叫(f)
f(d); // 呼叫(g)
C 模板特化和偏特化
1.引言 c 中的模板分為類模板和函式模板,雖然它引進到c 標準中的時間不是很長,但是卻得到了廣泛的應用,這一點在stl中有著充分的體現。目前,stl在c 社群中得到了廣泛的關注 應用和研究。理解和掌握模板是學習 應用和研究以及擴充stl的基礎。而stl模板例項中又充斥著大量的模板特化和偏特化。2....
c 模板特化和偏特化
定義乙個棧的類模板,它可以用來容納不同的資料型別,說明如下 template class stack 上述定義中,template告訴編譯器這是乙個模板,尖括號中的指明模板的引數,可以有乙個或多個,具體實現時由使用者指定,其中template中的關鍵字class可以用關鍵字typename來代替。類...
C 模板特化和偏特化
使用模板時會遇到一些特殊的型別需要特殊處理,不能 或不希望 直接使用當前的模板版本時,所以此時我們就需要對該型別定義乙個類或函式的特例化版本。例 當使用乙個判斷相等的模板函式時 templatebool isequal t p1,t p2 但是該模板函式在對於字串進行比較時就不能使用了,對於字串我們...