C 函式模板

2021-07-24 08:49:17 字數 2931 閱讀 9095

所謂模板,是c++中實現多型的又一方法。我們已經知道函式過載可以實現多型,讓乙個函式名多用。這樣可以簡化函式的呼叫形式,但是又必須定義每乙個函式。

c++提供模板正是為了簡化這乙個過程。

首先,讓 我們寫乙個add函式

int add(int x,int y)

ok,現在我們要對add函式進行過載

char add(char x, char y)

我們新定義了乙個日期型別date,我們又得對date進行過載

date add(date& d1, date &d2)

額,我們為什麼如此的粗心。。。把「+」寫成了「-」

這樣的話,我們需要修改所有過載函式的邏輯。這就是函式過載的缺點

雖然只需要把所有的加號換過來就好了,可是由於我們寫的是非常簡單的函式(只有一條返回語句)。當我們寫了很長很長的語句時,這就會有很大的工作量了

函式過載的缺點:

(1)每當需要新的型別出現後,需要過載對應新增的函式

(2)函式過載的各個函式,大體函式邏輯一樣,只是改變了型別。導致**的利用率不高。

(3)當邏輯出現問題時,需要修改所有過載的函式。不方便維護

(4)函式過載無法解決返回值的問題

由於函式過載的諸多缺點,我們引入了【泛型程式設計】的概念。所謂的【泛型程式設計】,就是編寫與型別無關的**,是提高**復用的一種手段。

而泛型程式設計,又包括【函式模板】【類模板】。模板是泛型程式設計的基礎!

關鍵字template

函式模板定義格式:

注意:

(1)函式模板不是類或者函式,它只是乙個藍圖。只有在模板例項化後編譯器才會為之生成對應的類或者函式。

(2)模板會被編譯兩次,第一次檢查模板裡的語法是否有錯,如缺少分號;第二次則是在例項化的時候,會檢視所有的呼叫是否都是有效的。

編譯器只能執行兩種轉換

1、const轉換

接收const物件指標或者const物件引用的引數,可以用非const物件的指標或引用進行呼叫

templatet add(const t& x,const t& y)

int main()

2、函式或者陣列到指標的轉換

如果模板不是引用型別的話,那麼它對函式或者陣列型別的實參應轉為指標

template t add(const t* x, const t* y)

int main()

; int b[5] = ;

cout << "a + b = " << add(a, b) << endl;

return 0;

}

模板引數

包括兩種型別,分別是型別形參和非型別形參

模板形參的名字只能在模板形參之後,到模板的宣告和定義的結束使用,遵循就近原則。

template//funtest函式模板

void funtest(t t)

t global;

int main()

注意:1、模板形參的名字在同一模板引數列表內只能使用一次

templatevoid funtest(t a,t b)

2、所有模板前必須加上class或者typename關鍵字進行修飾

templatevoid funtest(t a,u b)

當然,函式模板也是可以過載的。

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

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

;int main()

上面我們過載了兩個求最大值的函式模板,他們只有模板的引數不同而已

int max(const int& left, const int & right)//普通函式  

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

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

;int main()

注意:在此種情況下,編譯器會先在非模板的函式中搜尋與之引數型別,個數完全匹配的函式;如果找到了,編譯器便會呼叫它,不會讓函式模板進行例項化;

如果沒有找到,則通過函式模板進行例項化;如果想讓編譯器不呼叫非模板函式,則需要在呼叫的時候進行顯示例項化,這樣的話,函式模板例項化生成的**也和原來定義的

非模板函式不是同一塊**

有時候,不能寫出對所有可能例項化出來的型別都最適合的模板,在某些情況下,通過模板定義的函式有可能對於某個型別是錯誤的,或者編譯失敗,或邏輯錯誤

template int compare(t s1, t s2)   

int main()

就可以避免錯誤的發生

注意:特化一定要和原模板函式版本的形參型別完全一致

c 函式模板

include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...

c 函式模板

關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...

C 函式模板

c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...