為了交換兩個int變數的值,需要編寫如下swap函式:
void swap(int & x, int & y)
為了交換兩個double變數的值,還需要編寫如下swap函式:
void swap(double & x, double & y)
能否只寫乙個swap, 就能交換各種型別的變數?用函式模板解決。
template
< class 型別引數1, class 型別引數2, … >
返回值型別 模板名 (形參表)
交換兩個變數值的函式模板:
template
void swap(t & x, t & y)
int main()
函式模板中可以有不止乙個型別引數。
template
< class t1, class t2>
t2 print(t1 arg1, t2 arg2)
求陣列最大元素的maxelement函式模板:
template
t maxelement(t a, int size) //size是陣列元素個數
函式模板可以過載,只要他們的形參表不同即可。
例,下面的兩個模板可以同時存在:
template
< class t1, class t2>
void print(t1 arg1, t2 arg2)
c++編譯器遵循以下優先順序:
step 1:先找引數完全匹配的普通函式(非由模板例項化而得的函式)
step 2:再找引數完全匹配的模板函式
step 3:再找實參經過自動型別轉換後能夠匹配的普通函式
step 4:上面的都找不到,則報錯
例:函式模板呼叫順序
template
< class t>
t max(t a, t b)
template
< class t, class t2>
t max(t a, t2 b)
double max(double a, double b)
int main()
執行結果:
mymax
template max 1
template max 2
賦值相容規則引起函式模板中型別引數的二義性。
template< class t>
t myfunction(t arg1, t arg2)
…myfunction(5, 7); //ok: replace t with int
myfunction(5.8, 8.4); //ok: replace t with double
myfunction(5, 8.4); //error: replace t with int or double? 二義性
可以在函式模板中使用多個型別引數, 可以避免二義性。
templatet1, class
t2>
t1 myfunction( t1 arg1, t2 arg2)
…myfunction(5, 7); //ok:replace t1 and t2 with int
myfunction(5.8, 8.4); //ok: replace t1 and t2 with double
myfunction(5, 8.4); //ok: replace t1 with int, t2 with double
總結
函式模板的格式
template < class 形參名,class 形參名,……> 返回型別 函式名(引數列表)
函式體其中template和class是關見字,class可以用typename 關見字代替,在這裡typename 和class沒區別,<>括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一但宣告了模板函式就可以用模板函式的形參名宣告類中的成員變數和成員函式,即可以在該函式中使用內建型別的地方都可以使用模板形參名.模板形參需要呼叫該模板函式時提供的模板實參來初始化模板形參,一旦編譯器確定了實際的模板實參型別就稱他例項化了函式模板的乙個例項。比如swap的模板函式形式為
template < class t> void swap(t& a, t& b){},
當呼叫這樣的模板函式時型別t就會被被呼叫時的型別所代替,比如swap(a,b)其中a和b是int 型,這時模板函式swap中的形參t就會被int 所代替,模板函式就變為swap(int &a, int &b)。而當swap(c,d)其中c和d是double型別時,模板函式會被替換為swap(double &a, double &b),這樣就實現了函式的實現與型別無關的**。
2、注意:對於函式模板而言不存在 h(int,int) 這樣的呼叫,不能在函式呼叫的引數中指定模板形參的型別,對函式模板的呼叫應使用實參推演來進行,即只能進行 h(2,3) 這樣的呼叫,或者int a, b; h(a,b)。
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 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...