模板類也是模板,必須以關鍵字template開頭,後接模板形參表。
template
class 類名
上面提到的模板引數和模板的模板引數在下一節vector迭代器時再分析。
一、模板引數
(1)模板型別形參
型別形參由關鍵字class或typename後接說明符構成。在函式模板形參表中,二者含義相同。typename其實比class更直觀,更清楚的指明後面的名字是乙個型別名(包括內建型別),而class很容易讓人聯想到類宣告或類定義。
此外,在使用巢狀依賴型別(nested depended name)時,必須用到typename關鍵字。
在類的內部可以定義型別成員。如果要在函式模板內部使用這樣的型別,必須顯示告訴編譯器這個名字是乙個型別,否則編譯器無法得知它是乙個型別還是乙個值。預設情況下,編譯器假定這樣的名字指定(靜態)資料成員,而不是型別。所以下面這段程式,如果去掉typename關鍵字,將會出現編譯錯誤。
template
parm fcn(parm *array, u value)
(2)非型別模板形參
模板形參也可以是非型別形參,在使用時非型別形參由常量表示式代替。
template
void
array(t (&parm)[n])
…int x[42];
double y[10];
array(x); // array(int (&)[42])
array(y); // array(double (&)[10])
浮點數和類物件是不允許作為非型別模板引數的。
二、類模板的特化:
1、全特化:
//普通模板函式
template
struct vector
;template
vector::vector()
: _start(0)
, _finish(0)
, _endofstorage(0)
template
vector::vector(const t* array, size_t size)
:_start(new t[size])
, _finish(_start)
, _endofstorage(_start + size)
template
vector::~vector()
//特化成int 型
//特化後定義成員函式不再需要模板形參
2、偏特化:
偏特化可以分為兩種
(1)部分引數的區域性特化
(2)對模板引數進行更進一步的具體特化,比如特化為指標型別,或者引用型別
先來看第一種
///
////////區域性特化///
//////
///////
//普通模板類
template class b
;template b::b()
//區域性特化第乙個引數
下面是第二種偏特化:
template
class b
;template
b::b()
//區域性特化兩個引數為指標型別
三、模板的分離編譯
總結:
C 泛型程式設計(二) 類模板
背景 在呼叫類模板時,指定引數,由編譯系統根據引數提供的資料型別自動產生相應的模板類 template class 型別引數1 class 型別引數2,class 類模板名 template 型別參數列 返回值型別 類模板名 型別引數名列表 成員函式名 參數列 類模板名 真實型別參數列 物件名 建構...
C 泛型程式設計 模板
在學習c c 過程中,我們可能常用幾種函式,由於傳入的引數不同,需要進行不同的函式的編寫,在c語言中需要根據引數和功能的不同重新編寫新的函式,而在c 中有函式過載這樣的機制,一定程度上解決了問題,但是 過載的函式僅僅只是型別不同,的復用率比較低,只要有新型別出現時,就需要增加對應的函式 的可維護性比...
C 泛型程式設計(模板)
2.類模板 我們先來看乙個概念 泛型程式設計 使用模板,編寫和型別無關的 沒有模板之前,一些函式或者類,針對不同的型別需要寫很多重複的 函式 比如交換函式swap,假如傳入的資料型別不同,int,char,double。我們要實現不同的型別物件函式。類 比如我們像實現乙個資料結構棧stack,sta...