c++模板特化
一、模板特化, specialization of template
模板特化(specialization of template)並不是說例項化乙個模板,如template ,class stack;宣告stack,這是例項化乙個模板類。
類模板特化的意思是,對於某個特定的型別,需要對模板進行特殊化,即特殊的處理。例如,stack類模板針對bool型別有特化,因為實際上bool型別只需要乙個二進位制位,就可以對其進行儲存,使用乙個字或者乙個位元組都是浪費儲存空間的.
同樣,函式模板特化也是針對某個特定型別的特殊處理,乙個比較經典的例子:
template
t mymax(const t t1, const t t2)
main()
如果需要得到正確結果就需要針對const char*的函式模板特化:
const char* mymax(const char* t1,const char* t2)
二、模板偏特化,partial specialization of template
模板的偏特化是指需要根據模板的某些但不是全部的引數進行特化。
1. 類模板的偏特化
例如c++標準庫中的類vector的定義
template
class vector ;
template
class vector;
這個偏特化的例子中,乙個引數被繫結到bool型別,而另乙個引數仍未繫結需要由使用者指定。
2. 函式模板偏特化
嚴格的來說,函式模板並不支援偏特化,但由於可以對函式進行過載,所以可以達到類似於類模板偏特化的效果。
template void f(t); (a)
根據過載規則,對(a)進行過載
template void f(t*); (b)
如果將(a)稱為基模板,那麼(b)稱為對基模板(a)的過載,而非對(a)的偏特化。c++的標準委員會仍在對下乙個版本中是否允許函式模板的偏特化進行討論。
三、模板特化時的匹配規則
(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)
[附]和區別
前者只支援窄字符集,已經被ansi/iso c++標準委員會捨棄
後者支援窄字符集和寬字符集
C 模板 模板特化 模板偏特化
模板是c 的乙個重要特性 使用模板 可以極大的減少類似功能 的編寫 這可以看做是c 相較於c的進步 因為這一特性在c中是不容易達到的 語言層面不支援 模板的關鍵字是 template 簡單的模板應用 template class test int main 使用模板的類在例項化時需要指明模板引數型別...
C 模板特化 偏特化
注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...
c 模板特化偏特化
模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你對某一功能有更好地實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是模板如果有多個型別,那麼就只限定為其中的 一部分,其實特化細分為範圍上的偏特化與個數上的偏特化。模板的泛化 ...