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