1.什么是函数模板?
在创建完成抽象操作的函数时,如:拷贝,反转和排序,你必须定义多个版本以便能处理每一种数据类型。以 max() 函数为例,它返回两个参数中的较大者:double max(double first, double second);
complex max(complex first, complex second);
date max(date first, date second);
//..该函数的其它版本
尽管这个函数针对不同的数据类型其实现都是一样的,但程序员必须为每一种数据类型定义一个单独的版本:
double max(double first, double second)
{
return first>second? first : second;
}
complex max(complex first, complex second)
{
return first>second? first : second;
}
date max(date first, date second)
{
return first>second? first : second;
}
这样不但重复劳动,容易出错,而且还带来很大的维护和调试工作量。更糟的是,即使你在程序中不使用某个版本,其代码仍然增加可执行文件的大小,大多数编译器将不会从可执行文件中删除未引用的函数。
用普通函数来实现抽象操作会迫使你定义多个函数实例,从而招致不小的维护工作和调试开销。解决办法是使用函数模板代替普通函数。
2. 定义?
定义的一般形式: template函数返回值类型 函数名(参数表){ 函数体 } 例如: templat T1 fun(T1 a,T2 b){ T2=d; 、、、、、、 } 如果主调函数中有: int x; double y;fun(x,y);则系统将用实参x的数据类型int和y的数据类型double的代替函数模板中的T1和T2,生成模板函数 int fun(int a,double b) { double d; 、、、、 } 书上例子: