C 泛型程式設計 (二)模板類

2021-08-09 16:26:25 字數 2630 閱讀 1543

模板類也是模板,必須以關鍵字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...