例4.7 將例4.6程序改爲通過函數模板來實現。
#include <iostream>
using namespace std;
template<typename T> //模板聲明,其中T爲類型參數
T max(T a,T b,T c) //定義一個通用函數,用T作虛擬的類型名
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
int main( )
{
int i1=185,i2=-76,i3=567,i;
double d1=56.87,d2=90.23,d3=-3214.78,d;
long g1=67854,g2=-912456,g3=673456,g;
i=max(i1,i2,i3); //調用模板函數,此時T被int取代
d=max(d1,d2,d3); //調用模板函數,此時T被double取代
g=max(g1,g2,g3); //調用模板函數,此時T被long取代
cout<<″i_max=″<<i<<endl;
cout<<″f_max=″<<f<<endl;
cout<<″g_max=″<<g<<endl;
return 0;
}
運行結果與例4.5相同。爲了節省篇幅,數據不用cin語句輸入,而在變量定義時初始化。程序第3~8行是定義模板。
定義函數模板的一般形式爲:
template < typename T> 或 template <class T>
通用函數定義 通用函數定義
在建立函數模板時,只要將例4.5程序中定義的第一個函數首部的int改爲T即可。即用虛擬的類型名T代替具體的數據類型。在對程序進行編譯時,遇到第13行調用函數max(i1,i2,i3),編譯系統會將函數名max與模板max相匹配,將實參的類型取代了函數模板中的虛擬類型T。此時相當於已定義了一個函數:
int max(int a,int b,int c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
然後調用它。後面兩行(14,15行)的情況類似。
類型參數可以不只一個,可以根據需要確定個數。如
template <class T1,typename T2>
可以看到,用函數模板比函數重載更方便,程序更簡潔。但應注意它只適用於函數的參數個數相同而類型不同,且函數體相同的情況,如果參數的個數不同,則不能用函數模板。