C 模板偏特化

2021-05-23 18:04:14 字數 1975 閱讀 7304

vc 2005 vc2008 vc 2010 activex 事件 event

c++類模板

(1)類模板特化

有時為了需要,針對特定的型別,需要對模板進行特化,也就是特殊處

理.例如,stack類模板針對bool型別,因為實際上bool型別只需要一

個二進位制位,就可以對其進行儲存,使用乙個字或者乙個位元組都是浪

費儲存空間的.

template

class stack {};

template < >

class stack;

上述定義中template < >告訴編譯器這是乙個特化的模板。

(2) 函式模板的特化

看下面的例子

main()

前面兩個mymax都能返回正確的結果.而第三個卻不能,因為,此時

mymax直接比較兩個指標p1 和 p2 而不是其指向的內容.

針對這種情況,當mymax函式的引數型別為const char* 時,需要特化

。template

t mymax(const t t1, const t t2)

template <>

const char* mymax(const char* t1,const char* t2)

現在mymax(p1,p2)能夠返回正確的結果了。

4.模板的偏特化

模板的偏特化是指需要根據模板的某些但不是全部的引數進行特化

(1) 類模板的偏特化

例如c++標準庫中的類vector的定義

template

class vector ;

template

class vector;

這個偏特化的例子中,乙個引數被繫結到bool型別,而另乙個引數

仍未繫結需要由使用者指定。

(2) 函式模板的偏特化

嚴格的來說,函式模板並不支援偏特化,但由於可以對函式進行

過載,所以可以達到類似於類模板偏特化的效果。

template void f(t);   (a)

根據過載規則,對(a)進行過載

template < class t> void f(t*);   (b)

如果將(a)稱為基模板,那麼(b)稱為對基模板(a)的過載

,而非對(a)的偏特化。c++的標準委員會仍在對下乙個版本中是

否允許函式模板的偏特化進行討論。

5.模板特化時的匹配規則

(1) 類模板的匹配規則

最優化的優於次特化的,即模板引數最精確匹配的具有最高的優先

權例子:

template class vector; // (a)   普通型

template class vector;   // (b) 對指

針型別特化

template <>    class vector ;   // (c) 對

void*進行特化

每個型別都可以用作普通型(a)的引數,但只有指標型別才能用作

(b)的引數,而只有void*才能作為(c)的引數

(2) 函式模板的匹配規則

非模板函式具有最高的優先權。如果不存在匹配的非模板函式的話

,那麼最匹配的和最特化的函式具有高優先權

例子: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);   //   呼叫(h)

C 模板特化 偏特化

注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...

c 模板特化偏特化

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

C 模板特化 偏特化

模板分為函式模板和類模板,特化分為全特化和偏特化 partial specialization 其中,類模板有全特化和偏特化,函式模板只能全特化。使用模板的時候,我們的目的就是希望可以不用每個型別實現一遍,而是用乙個模板代替這個型別。如果所有型別的實現都是乙個統一的一樣的實現,就不需要模板特化或者偏...