C 泛型程式設計 函式模板 類模板

2021-09-11 19:43:00 字數 3312 閱讀 8265

以前我們寫過乙個簡單的交換函式。我們不難發現交換函式是與型別有很大關係的,int,double....那麼如何實現乙個通用的交換函式呢?

void swap(int& left, int& right)

void swap(double& left, double& right)

void swap(char& left, char& right)

......

使用函式過載雖然可以實現,但是有一下幾個不好的地方:

那能否告訴編譯器乙個模子,讓編譯器根據不同的型別利用該模子來生成**呢?

泛型程式設計:編寫與型別無關的通用**,是**復用的一種手段。模板是泛型程式設計的基礎。

函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。

template返回值型別 函式名(引數列表) {}

下面來舉個栗子

templatevoid swap(t& left, t& right)

【注意】typename是用來定義模板引數關鍵字,也可以使用class(切記:不能使用struct代替class)

模板是乙個藍圖,它本身並不是函式,是編譯器用使用方式產生特定具體型別函式的模具。所以其實模板就是將本來應該我們做的重複的事情交給了編譯器。

在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。比如:當用double型別使用函式模板時,編譯器通過對實參型別的推演,將t確定為double型別,然後產生乙份專門處理double型別的**,對於字元型別也是如此。

但是其實在底層並沒有減少**量,雖然我們只寫了乙個模板,但是有多個型別時,編譯器會自動推演出各個型別的**,這個推演過程就是例項化。

用不同型別的引數使用函式模板時,稱為函式模板的例項化。模板引數例項化分為:隱式例項化顯式例項化

在下面的**中,我們並沒有寫t是什麼型別,編譯器在編譯時推出a1是int型,則生成乙份型別為int型的**,推出b1是double型,則生成乙份型別是double的**。

templatet add(const t& left, const t& right)

int main()

【注意】在模板中,編譯器一般不會進行型別轉換操作,如下面這段**。

templatet add(const t& left, const t& right)

int main()

此時有兩種處理方式:1. 使用者自己來強制轉化   2. 使用顯式例項化 

templatet add(const t& left, const t& right)

int main(void)

如果型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯。

1. 乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式

// 專門處理int的加法函式

int add(int left, int right)

// 通用加法函式

templatet add(t left, t right)

void test()

2. 對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板。

// 專門處理int的加法函式

int add(int left, int right)

// 通用加法函式

templatet1 add(t1 left, t2 right)

void test()

3. 模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換

總結起來就是:有現成的,就用現成的;沒有現成的,就編譯器根據引數自己推演,把模板例項化;如果指定了用模板,就必須用模板。模板不支援分離編譯。

templateclass 類模板名

;

我們通過實現資料結構中的順序表來理解一下類模板

#include #include using namespace std;

templateclass vector

~vector() }

void pushback(const t& x)//void pushback(vector*this,const t& x)

size_t size()

t operator(size_t pos)//陣列運算子過載

private:

t* _array;

size_t _size;

size_t _capacity;

};

在這裡我們不難發現,類模板其實就是把之前建立乙個類的時候的型別用t代替,在使用時進行例項化。

類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>

中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。

int main()

cout << endl;

vectorv2;

v2.pushback('a');

v2.pushback('b');

v2.pushback('c');

v2.pushback('d');

for (size_t i = 0; i < v2.size(); ++i)

cout << endl;

system("pause");

return 0;

}

c 模板入門,泛型程式設計 函式模板 類模板

目錄 1.泛型程式設計 2.函式模板 2.1 函式模板概念 2.2函式模板格式 2.3 函式模板的原理 2.4 函式模板的例項化 2.5 模板引數的匹配原則 3.類模板 3.1 類模板的定義格式 3.2 類模板的例項化 如何實現乙個通用的交換函式?使用函式過載雖然可以實現,但是有一下幾個不好的地方 ...

函式模板(泛型程式設計)

函式模板就是將函式型別引數化,方便程式設計。1 普通函式模板 include using namespace std template template是告訴編譯器,要開始泛型程式設計了,並用t替代函式的引數型別 void myswap t a,t b template 定義兩個泛型,其實定義乙個也...

泛型程式設計 函式模板

當函式的業務邏輯相同但是函式的引數不相同時,讓型別引數化,讓程式設計師能夠方便程式設計,就用到了泛型程式設計。基本語法 includeusing namespace std 函式的業務邏輯一樣但是函式的引數不一樣 void myswap01 int a,int b void myswap02 cha...