模板和泛型程式設計的相關知識(函式模板)

2021-08-09 10:10:03 字數 3398 閱讀 2583

上篇部落格中講述了多型的相關知識,其中靜態多型有兩種:函式過載和泛型程式設計。函式過載在部落格中已經解釋過,接下來看看泛型程式設計的相關知識。

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

模板:模板分為函式模板和類模板。

具體來介紹函式模板與類模板。

《一》、函式模板

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

模板的例項化:模板本身不是類或函式,編譯器用模板產生指定的類或者函式的指定型別版本,產生模板特定型別的過程稱為函式模板例項化。

下面舉例說明為:

#include

#include

using

namespace

std;

template

t add(t a, t b)

int main()

結果顯示為:

在此舉例中會發現add

(4.5, 6.45) 和add(4,(int)6.5).它們分別是顯示例項化和隱式例項化,若給成add(4,6.5)這種形式編譯器無法進行編譯,因為其各自的型別不一致。而在顯式例項化中編譯器會自動生成乙個函式。

另外要注意的是模板被編譯了兩次。1.例項化之前,檢查**本身,檢視是否出現語法錯誤,但不是每個錯誤均可找出。

2.在例項化期間,檢查末班**,檢視呼叫的是否都有效。如:例項化型別不支援某些函式呼叫。

template 

t>

t add(t a, t b)

int main()

```該模板可以變異通過,但是在例項化的編譯中無法通過編譯,因為 return (a + b)後面缺少分號。

**型別形參轉換**:一般不會轉換實參匹配已有的例項化,而是會產生新的例項。

編譯器會執行兩種轉換:

1、const 轉換:接收const引用或者const指標的函式分別用非const物件的引用或者指標來呼叫。

class="se-preview-section-delimiter">div>

這裡寫**片

「`2、陣列或函式到指標的轉換:如果模板形參不是引用型別,則對陣列或函式型別的實參應用常規指標轉換。

陣列實參將當做指向其第乙個元素的指標,函式實參當做指向函式型別的指標。

template

void funtest(const t &a)

int main()

結果如圖所示:

2、陣列或函式到指標的轉換:如果模板形參不是引用型別,則對陣列或函式型別的實參應用常規指標轉換。

陣列實參將當做指向其第乙個元素的指標,函式實參當做指向函式型別的指標。

具體舉例如下:

template

void funtest(const t a)

int main()

template

void funtest(const t a)

int main()

結果如圖顯示:

相同若傳函式,則其型別為函式指標型別。

模板引數

模板形參:型別形參,非型別形參。

模板形參名字只能在模板形參之後到模板宣告或定義之前使用,遵循名字遮蔽原則。

typedef

int t;

template

void funtest(t t)

;t g;

int main()

顯示結果為:

非模板型別引數:非模板型別形參是模板內部定義的常量,在需要常量表示式的時候,可以使用非模板型別引數。具體舉例如下:

其中的int n為非模板型別的形參。n不同所代表的函式也不同。

模板形參說明:

1、模板形參表使用<>,和函式引數列表一樣,跟多個引數時必須用逗號隔開,型別可以相同可以不同。例如:template

template

t max(const t&a, const t&b)//給成引用節省空間

//若是三個進行比較則要進行過載

template

t max(const t&a, const t&b, const t&c)

int main()

當然該模板並不能進行字串的比較,那麼應該怎麼辦呢?

例如:

template

int compare(t a, t b)

int main()

結果會發現他比較的僅是這兩者的位址大小,答案並不正確

下面我們又提出了解決方法—-特化

模板函式特化:如兩個字串的比較,我們給出特化形式為

template

<>

int compare

char*>(const

char* const a,const

char* const b)

結果修正為:

template

int compare(t a, t b)

template

<>

int compare

char*>(const

char*const a, const

char* const b)

int main()

最後關於特化:特化不能出現在模板例項的呼叫之後,應該在標頭檔案中包含模板特化的宣告,然後使用該特化版本的每個原始檔包含標頭檔案。

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

函式模板就是將函式型別引數化,方便程式設計。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...

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

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