c++新增特性–函数模板。函数模板是通用的函数描述,也就是说,采用泛型编程,其中的泛型可以使用具体的类型(如int或double)替换,通常将类型作为参数传递给模板,可使编译器生成该类型的函数。
应用场景:比如现在已有一个交换两个 int 值的函数 Swap,当我们想交换两个 double 值时或 char 值时,一种办法是复制原先的代码,将 int 全部改为double或char,而c++的函数模板功能可以方便的完成这一功能,函数模板允许以任意类型的方式定义函数。
一. 函数模板的定义
template <typename T>
void Swap(T &a,T &b)
{
T temp;
temp=b;
b=a;
a=temp;
}
第一行指出要建立一个模板,①关键字template和typename不可少(有时可以使用class代替typename),并将此类型命名为T;②必须使用尖括号;③类型名可以任意选择,只要符合c++命名规则即可。
下面的栗子描述交换两个值的程序:
#include <iostream>
using namespace std;
template<typename T>//模板原型
void Swap(T &a,T &b);
int main()
{
int a=12,b=34;
cout<<"Original,a,b= "<<a<<","<<b<<endl;
Swap(a,b);
cout<<"Now,a,b= "<<a<<","<<b<<endl;
double c=12.0,d=34.12;
cout<<"Original,c,d= "<<c<<","<<d<<endl;
Swap(c,d);
cout<<"Now,c,d= "<<c<<","<<d<<endl;
return 0;
}
template<typename T>//模板定义
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
输出:
注意:函数模板不能缩短可执行程序,对于此程序来说,最终有两个独立的函数定义,就像以手工方式定义了这两个函数一样。最终代码不包括任何模板,而只包含了为程序生成的实际函数。使用模板的好处是,它使生成多个函数定义更简单、更可靠。
2. 重载的模板
需要多个对不同类型使用同一算法的函数时,可使用模板,然而,并非所有的类型都使用同一算法,此时,可以像常规函数重载 那样,重载模板函数,被重载的模板函数特征标必须不同。例如,在上述交换两个值的模板基础上,新增交换两个数组元素的模板,原来的模板特征标是(T &a,T &b),现在的模板特征标是(T a[ ],T b[ ], int n)。
将上述例子加入模板重载之后,程序如下:
#include <iostream>
using namespace std;
const int MaxNum=4;
template<typename T>//模板原型
void Swap(T &a,T &b);
template<typename T>
void Swap(T a[],T b[], int n);
template<typename T>
void show(T a[],int n);
int main()
{
int a=12,b=34;
cout<<"Original,a,b= "<<a<<","<<b<<endl;
Swap(a,b);
cout<<"Now,a,b= "<<a<<","<<b<<endl;
double c=12.0,d=34.12;
cout<<"Original,c,d= "<<c<<","<<d<<endl;
Swap(c,d);
cout<<"Now,c,d= "<<c<<","<<d<<endl;
int arr1[MaxNum]={1,2,3,4};
int arr2[MaxNum]={5,6,7,8};
cout<<"Original, arr1数组元素有: "<<endl;
show(arr1,MaxNum);
cout<<"Original, arr2数组元素有: "<<endl;
show(arr2,MaxNum);
Swap(arr1,arr2,MaxNum);
cout<<"Now, arr1数组元素有: "<<endl;
show(arr1,MaxNum);
cout<<"Now, arr2数组元素有: "<<endl;
show(arr2,MaxNum);
return 0;
}
template<typename T>//模板定义
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
template<typename T>
void Swap(T a[],T b[], int n)
{
for (int i=0;i<n;i++)
{
T temp;
temp=a[i];
a[i]=b[i];
b[i]=temp;
}
}
template<typename T>
void show(T a[],int n)
{
for (int i=0;i<n;i++)
{
cout<<"数组的第"<<i+1<<"个元素:"<<a[i]<<endl;
}
}
输出: