函数模板
一、函数模板
- 函数模板使用泛型来定义函数,其中的泛型可用具体的类型(如 int 或double)替换。
- 通过将类型作为参数传递给模板,可使编译器生成该类型的函数。
- 由于模板允许以泛型的方式编写程序,因此有时也被称为通用编程。
- 由于类型是用参数表示的,因此模板特性有时也被称为参数化类型。
- 关键字:
template和typename
;typename可用class
替换,类型名:类型名可用任意选择,许多程序员都使用简单的名称,如:T
。
实例:
int main()
{
int i=10;
int j=20;
cout<<"i,j="<<i<<","<<j<<endl;
cout<<"Using compiler-generated int swapper:"<<endl;
Swap(i,j);//接受两个int
cout<<"Now i,j="<<i<<","<<j<<endl;
double x=24.5;
double y=81.7;
cout<<"x,y="<<x<<","<<y<<endl;
cout<<"Using compiler-generated double swapper:"<<endl;
Swap(x,y);///接受两个double
cout<<"Now x,y="<<x<<","<<y<<endl;
return 0;
}
template<class T>
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
1.重载的模板
需要多个对不同类型使用同一种算法的函数时,可使用模板,为满足这种需求,可用像重载常规函数定义那样重载模板定义。
和常规重载一样,被重载的模板的函数特征必须相同。
实例:
#include<iostream>
using namespace std;
template<class T>
void Swap(T &a,T &b);
template<class T>
void Swap(T*a,T*b,int n);
void Show(int a[]);
const int Lim=8;
int main()
{
int i=10;
int j=20;
cout<<"i,j="<<i<<","<<j<<endl;
cout<<"Using compiler-generated int swapper:"<<endl;
Swap(i,j);
cout<<"Now i,j="<<i<<","<<j<<endl;
int d1[Lim]={
0,7,0,4,1,7,7,6};
int d2[Lim]={
0,7,2,0,1,9,6,9};
cout<<"Original arrays:"<<endl;
Show(d1);
Show(d2);
Swap(d1,d2,Lim);
cout<<"Swapped arrays:"<<endl;
Show(d1);
Show(d2);
return 0;
}
template<class T>
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
template<class T>
void Swap(T a[], T b[],int n)
{
T temp;
for(int i=0;i<n;i++)
{
temp=a[i];
a[i]=b[i];
b[i]=temp;
}
}
void Show(int a[])
{
cout<<a[0]<<a[1]<<"/";
cout<<a[2]<<a[3]<<"/";
for(int i=4;i<Lim;i++)
cout<<a[i];
cout<<endl;
}
2.模板的局限性
假设有如下模板函数:
template<class T>
void f(T a,T b)
{
...}
通常,代码假定可执行那些操作。例如,下面的代码假定定义了赋值,但如果T为数组。假设将不成立:
a = b;
同样,下面的语句假设定义了<,但如果T为结构,该假设便不成立:
if(a>b)
另外,为数组名定义了运算符>,但由于数组名为地址,因此它比较的是数组的地址,而这可能不是您希望的,下面的语句假定为类