定義乙個棧的類模板,它可以用來容納不同的資料型別,說明如下:
上述定義中,template告訴編譯器這是乙個模板,尖括號中的template
class
stack ;
指明模板的引數,可以有乙個或多個,具體實現時由使用者指定,其中template
中的關鍵字class可以用關鍵字typename來代替。
類模板的使用除了要在宣告時指明模板引數外,其餘均與普通的類相同,例如:
有時為了需要,針對特定的型別,需要對模板進行特化,也就是特殊處理。例如,stack類模板針對bool型別,因為實際上bool型別只需要乙個二進位制位,就可以對其進行儲存,使用乙個字或者乙個位元組都是浪費儲存空間的。stack
int_stack;
stack
ch_stack;
stack
str_stack;
int_stack.push(10);
ch_stack.push(『z』);
str_stack.push(「c++」);
上述定義中template
class
stack {};
//對模板進行特化:
template
< >
class
stack
;
template < >
告訴編譯器這是乙個特化的模板。
類模板特化的幾種型別, 一是特化為絕對型別; 二是特化為引用,指標型別;三是特化為另外乙個類模板。!!!!!
以下述**為例:
這是乙個用於比較的類模板,裡面可以有多種用於比較的函式, 以isequal為例。// general version
template
class compare
};
1、特化為絕對型別
也就是說直接為某個特定型別做特化,這是我們最常見的一種特化方式, 如特化為float, double等。
2、特化為引用,指標型別// specialize for float
template
<>
class compare
};
除了t*
, 我們也可以將t特化為const t*, t&, const t&
等,以下還是以t*為例:
這種特化其實是就不是一種絕對的特化, 它只是對型別做了某些限定,但仍然保留了其一定的模板性,這種特化給我們提供了極大的方便, 如這裡, 我們就不需要對int*, float*, double*等等型別分別做特化了。// specialize for t*
template
class compare
};
3、特化為另外乙個類模板
這其實是第二種方式的擴充套件,其實也是對型別做了某種限定,而不是絕對化為某個具體型別,如下:
這就把isequal的引數限定為一種vector型別,但具體是// specialize for vector
template
class compare>
}return
true;
}};
vector
還是vector
, 我們可以不關心。
模板的偏特化是指需要根據模板的某些但不是全部的引數進行特化。
例如c++標準庫中的類vector的定義
這個偏特化的例子中,乙個引數被繫結到bool型別,而另乙個引數仍未繫結需要由使用者指定。template
class
vector ;
//對模板的t引數偏特化
template
class
vector
;
假設現在要定義乙個max函式來返回同一型別(這種型別是允許比較的)兩個值的最大者.
template
t mymax(const t& t1,const t& t2)
template
的意義與類模板定義中相同。
模板函式的使用與普通非模板函式使用相同,因為模板函式的引數可以從其傳入引數中解析出來。例如:
int highest = mymax(5,10);
char c = mymax(『a』, 』z』);
mymax(5,10)
解析出模板函式引數為int,mymax(『a』, 』z』)
解析出模板函式的引數為char。
看下面的例子
前面兩個mymax都能返回正確的結果。而第三個卻不能,因為此時mymax直接比較兩個指標p1 和 p2 而不是其指向的內容。main()
針對這種情況,當mymax函式的引數型別為const char* 時,需要特化。
現在mymax(p1,p2)能夠返回正確的結果了。template
t mymax(const t t1, const t t2)
//對函式模板進行特化:
template
<>
const
char* mymax(const
char* t1,const
char* t2)
嚴格的來說,函式模板並不支援偏特化!!!,但由於可以對函式進行過載,所以可以達到類似於類模板偏特化的效果。
C 模板特化和偏特化
1.引言 c 中的模板分為類模板和函式模板,雖然它引進到c 標準中的時間不是很長,但是卻得到了廣泛的應用,這一點在stl中有著充分的體現。目前,stl在c 社群中得到了廣泛的關注 應用和研究。理解和掌握模板是學習 應用和研究以及擴充stl的基礎。而stl模板例項中又充斥著大量的模板特化和偏特化。2....
C 模板特化和偏特化
使用模板時會遇到一些特殊的型別需要特殊處理,不能 或不希望 直接使用當前的模板版本時,所以此時我們就需要對該型別定義乙個類或函式的特例化版本。例 當使用乙個判斷相等的模板函式時 templatebool isequal t p1,t p2 但是該模板函式在對於字串進行比較時就不能使用了,對於字串我們...
C 模板特化 偏特化
注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...