如果需要一个用于交换两个int值的函数,我们可以这样定义:

void Swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void Swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}

但是现在如果需要交换的值不是int型,而是double型,又得重新重载一下Swap函数:

double
void Swap(double a, double b)
{
double temp;
temp = a;
a = b;
b = temp;
}

如果又有要交换值的地方,并且值的类型是char,又得重新重载一下Swap函数,这样下去是很繁琐的,所以C++提出了一种解决办法:函数模板.

1、函数模板的定义

函数模板允许以任意类型的方式来定义函数,例如:

temp = a;
a = b;
b = temp;
template <typename AnyType>
void Swap(AnyType &a, AnyType &b)
{
AnyType temp;
temp = a;
a = b;
b = temp;
}

//注意:在标准C++98添加关键字typename之前,C++使用关键字class来创建模板
template <class T>
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}

2、函数模板的使用

#include<iostream>
int main()
{
using namespace std;
int i = 10;
int j = 20;
//generates void Swap(int &, int &)
Swap(i,j);

double i = 24.5;
double j = 81.7;
//generates void Swap(double &, double &)
Swap(i,j);
}

注意:函数模板不能缩短可执行程序,最终的代码不包含任何模板,仍将是由两个独立的函数定义,就像以手工方式定义这些函数一样,但是使用模板可以使得生成多个函数定义更简单、更可靠。

3、重载的模板

需要对多个不同类型使用同一算法的函数时,可使用模板。但是并非所有的类型都使用相同的算法,为了满足这种需求,可以向重载常规函数定义那样重载模板定义,例如:

#include<iostream>

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)
{
T temp;
for(int i = 0; i<n; i++)
{
temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}


int main()
{
using namespace std;
int i = 10;
int j = 20;
//generates void Swap(int &, int &)
Swap(i,j);

int len = 5;
int d1[len] = {1,2,3,4,5};
int d2[len] = {10,9,8,7,6};
Swap(d1,d2,len);
}