函数模板
函数模板使用泛型定义函数,也叫做通用编程。它并不会创建函数,而只告诉编译器如何定义函数。
1.基本结构
此函数可以交换任意两个数的值(无论类型):
template <typename T>
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
示例:
#include <iostream>
using namespace std;
template <typename T>
void Swap(T &,T &); //这里的定义必不可少
int main()
{
int a,b;
cin>>a>>b;
Swap(a,b);/*::max();调用的自己写的max()
std::max();调用的标准模板库的max*/
cout<<a<<" "<<b<<endl;
double c,d;
cin>>c>>d;
Swap(c,d);
cout<<c<<" "<<d<<endl;
}
template <typename T>
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
2.重载的模板
可以像重载常规函数定义一样重载模板定义,不过特征标必须不同。同时注意并非所有的模板参数类型都是泛型。
以下为一个交换数组中元素的函数:
template <typename T>
void f(T &a,T &b)
{
...
}
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[i];
}
}
3.显式具体化
有的运算符不适用于所有变量类型,可能会导致错误;对于特定类型的变量,一味使用函数模板可能会导致意料之外的结果。
解决方案:
- 运算符重载
- 显式具体化
//优先级:从上到下
void swap(job &,job &);
template <> void swap <job> (job &,job &)
template <typename T>
void swap(T &,T &)
这样就可以针对不同的变量类型使用特定的函数模板。
4.实例化
隐式实例化:函数模板通过传入的参数生成函数定义,如上文“基本结构”中的示例。
显式实例化:直接命令编译器创造特定命令的实例。
范例:function<type>(x,y,···)