函数模板
原创
©著作权归作者所有:来自51CTO博客作者贝勒里恩的原创作品,请联系作者获取转载授权,否则将追究法律责任
如果需要一个用于交换两个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);
}