1:函數模板不是一個實在的函數,因此編譯器不能為其生成可執行的代碼。定義函數模板只是一個對函數功能框架的描述,在具體執行時,將根據傳遞的實際參數決定其功能。
2:函數模板定義的一般形式如下:
template <類型形式參數> 返回類型 函數名(形式參數表)
{
...//函數實現
}
其中template為關鍵字,表示定義一個模板,尖括號“<>”中為模板參數,模板參數主要有兩種,一種是模板類型參數,另一種是模板非類型參數。上述代碼中定義的模板使用的是模板類型參數,模板類型參數使用關鍵字class或typedef開始,其后是一個用戶自定義的合法標識符。模板非類型參數和普通參數定義相同,通常為一個常數。
可以將聲明函數模板分成template部分和函數名部分。例如:
template <class T>
void fun(T t)
{
...//函數實現
}
例如,下面的代碼定義了一個求和的函數模板:
template <class type>//定義一個模板類型
type Sum(type xvar,type yvar)
{
return xvar+yvar;
}
在定義完函數模板之后,需要在程序中調用函數模板。下面的代碼演示了Sum函數模板的調用。
int iret=Sum(10,20);//實現兩個整數的相加
double dret=Sum(10,20.5);//實現兩個實數的相加
如果采用如下的形式調用Sum函數模板,將會出現錯誤。
int iret=Sum(10.5,20);//錯誤的調用
double dret=Sum(10,20.5);//錯誤的調用
上述代碼中為函數模板傳遞了兩個類型不同的參數。導致編譯器產生了歧義。如果在調用函數模板時顯示表示模板類型就不會出現錯誤。例如:
int iret=Sum<int>(10.5,20);//正確地調用函數模板
double dret=Sum<double>(10,20.5);//正確地調用函數模板
用函數模板生成實際可執行的函數又稱為模板函數。函數模板與模板函數不是一個概念。從本質上講,函數模板是一個“框架”,它不是真正可以編譯生成代碼的程序,而模板函數是把函數模板中的類型參數實例化后生成的函數,它和普通函數本質上是相同的,可以生成可執行代碼。
3:函數模板的作用
假設求兩個函數之中的最大者,如果想求整形數和實型數,那么需要定義兩個函數,這兩個函數定義如下:
int max(int a,int b)
{
return a>b?a:b;
}
float max(float a,float b)
{
return a>b?a:b;
}
如果想通過一個max函數來完成既求整型數之間最大者又求實型數之間的最大者,則可以使用函數模板和#define宏定義來實現。
#define宏定義可以在預編譯期對代碼進行替換。例如:
#define max(a,b) ((a)>(b)?(a):(b))
上述代碼可以求整數最大值和實型數最大值。但宏定義#define只是進行簡單替換,它無法對類型進行檢查,有時計算結果可能不是想要的。
使用模板函數求最大值的代碼如下:
template<class Type>
Type max(Type a,Type b)
{
if(a>b)
return a;
else
return b;
}
調用模板函數max可以分別正確地計算出整型數和實型數的最大值。例如:
cout<<“最大值:”<<max(10,1)<<endl;
cout<<“最大值:”<<max(200.05,100.4)<<endl;
4:使用數組作為模板函數,代碼如下:

// 9.1.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; template <class type,int len> //定義一個模板類型 type Max(type array[len]) //定義函數模板 { type ret = array[0]; //定義一個變量 for(int i=1; i<len; i++) //遍歷數組元素 { ret = (ret > array[i])? ret : array[i]; //比較數組元素大小 } return ret; //返回最大值 } void main() { int array[5] = {1,2,3,4,5}; //定義一個整型數組 int iret = Max<int,5>(array); //調用函數模板Max double dset[3] = {10.5,11.2,9.8}; //定義實數數組 double dret = Max<double,3>(dset); //調用函數模板Max cout << dret << endl; }
運行結果:
程序中定義了一個函數模板Max,用來求數組中元素的最大值,其中,模板參數使用模板類型參數type和模板非類型參數len,參數type 聲明了數組中的元素類型,參數len聲明了數組中的元素個數,給定數組元素后,程序將數組中的最大值輸出。