重學C 十二 模板特化和偏特化

2021-12-29 20:14:39 字數 1620 閱讀 1511

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 但是該模板函式在對於字串進行比較時就不能使用了,對於字串我們...