C++函數模板詳解

C++提供了函數模板(function template)。所謂函數模板,實際上是建立一個通用函數,其函數類型和形參類型不具體指定,用一個虛擬的類型來代表。這個通用函數就稱爲函數模板凡是函數體相同的函數都可以用這個模板來代替,不必定義多個函數,只需在模板中定義一次即可。在調用函數時系統會根據實參的類型來取代模板中的虛擬類型,從而實現了不同函數的功能。看下面的例子就清楚了。

例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>
可以看到,用函數模板比函數重載更方便,程序更簡潔。但應注意它只適用於函數的參數個數相同而類型不同,且函數體相同的情況,如果參數的個數不同,則不能用函數模板。
發佈了17 篇原創文章 · 獲贊 7 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章