C 泛型程式設計 模板

2021-09-25 05:03:49 字數 2277 閱讀 4301

在學習c/c++過程中, 我們可能常用幾種函式, 由於傳入的引數不同, 需要進行不同的函式的編寫, 在c語言中需要根據引數和功能的不同重新編寫新的函式, 而在c++中有函式過載這樣的機制,一定程度上解決了問題,但是

過載的函式僅僅只是型別不同,**的復用率比較低,只要有新型別出現時,就需要增加對應的函式

**的可維護性比較低,乙個出錯可能所有的過載均出錯

如果c++有乙個像生活中存在的模具一樣的東西, 我們往裡面填入什麼材料(型別), 就會生成相應材料的東西(函式/類)就會很方便了

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

函式模板使用格式:

/<>內可以是class t ,或者是typename t, t也可以換成其他名字,不過最好有明確的意義

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

先看乙個簡單地例子:

實現乙個add函式, 功能是返回傳入引數的和

templatet add(t a, t b)

int main()

根據模板的定義, 上面的add這個函式其實是不確定的,編譯器會根據引數的不同來推測出該生成什麼樣的**,顯然編譯器會推導為:

int add(int a, int b)

上面的**隱式示例化了函式模板,

在函式模板中,編譯器是不做隱式型別轉換的,有些情況下使用者需要自己顯示地指定傳入的引數型別

這樣的做法叫做顯式例項化:

templatet add(t a, t b)

int main()

此時解決方法也很簡單,編譯器不知道該怎麼推, 我們直接告訴他就好了

templatet add(t a, t b)

int main()

簡單總結起來:

1.有現成的,也是最合適的,就用現成的

2.有現成的,也有需要推導才能更合適的.就用推導出的更合適的

3.沒有現成的,只能推導新的

舉幾個例子:

1.有現成的,也是最合適的,就用現成的

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

int add(int a, int b)

// 通用加法函式

templatet add(t a, t b)

int main()

2.有現成的,也有需要推導才能更合適的.就用推導出的更合適的

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

int add(int a, int b)

// 通用加法函式

templateint add(t1 a, t2 b)

int main()

我們知道, 因為浮點數的儲存並不精確, 浮點數不能直接判斷是否相等,可是如果我們寫了乙個用於判斷是否相等的函式模板,例如:

templatebool equal(t a, t b)

如果我們給這個模板傳入兩個浮點數,肯定是不合適的

所以我們需要利用模板匹配的規則,寫乙個專門處理浮點數是否相等的函式:

bool equal(double a, double b)

return false;

}templatebool equal(t a, t b)

由於函式模板的匹配規則, 使用者傳入浮點數時,會呼叫現成的最為合適的函式,因此解決了浮點數的比較相等問題

這樣的處理方式就是模板的特化 : 也就是我們常說的特殊情況特殊對待

類模板定義格式:

templateclass 類模板名

;

類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類

C 泛型程式設計(模板)

2.類模板 我們先來看乙個概念 泛型程式設計 使用模板,編寫和型別無關的 沒有模板之前,一些函式或者類,針對不同的型別需要寫很多重複的 函式 比如交換函式swap,假如傳入的資料型別不同,int,char,double。我們要實現不同的型別物件函式。類 比如我們像實現乙個資料結構棧stack,sta...

C 泛型程式設計 模板

0.所謂泛型程式設計就是獨立於任何特定型別的方式編寫 使用泛型程式時,需要提供具體程式例項所操作的型別或者值。我們經常用到stl容器 迭代器 和演算法都是泛型程式設計的例子 模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返...

模板 泛型程式設計

我們從乙個很簡單的問題來進入泛型程式設計 question 如何寫乙個通用的加法函式 使用函式過載。針對每乙個所需相同行為的不同型別重新實現 函式過載的缺點 1 只要有 型別出現,就要重新新增對應函式 2 除型別外,所有函式的函式體都相同,的復用率不高 3 如果函式知識返回值型別不同,函式過載不能解...