代码改变世界

C++函数模板

2012-05-01 15:20  youxin  阅读(384)  评论(0编辑  收藏  举报
  泛型编程是一种思想,模板是实现这种思想的基础,STL则是使用模版技术体现泛型思想的结果。
 
  对不同类型数据施以相同操作的一族函数,为重用代码,我们可以把不同的数据类型抽象为类型参数,从而把这多个函数用统一的函数模板(function template)表示出来。从另一个角度说,函数模板也是生成具体函数的模型和样板。
 
函数模板的定义
       template <模板参数表>
      类型名  函数名(数据形参表)
      {
       函数体
      }
 
    <模板参数表> 尖括号中不能为空,参数可以有多个,用逗号分开。模板参数主要是模板类型参数。
 
    模板类型参数代表一种类型,由关键字 class 或 typename(建议用typename ) 后加一个标识符构成,在这里两个关键字的意义相同,它们表示后面的参数名代表一个待确定的内置或用户定义的数据类型
 

 

使用函数模板可能会产生二义性:

产生二义性,系统不能确定将其中的一个参数由整数转化为实数,还是应该将另一个参数由实数转化为整数
可使用强制类型转换解决:
int a =max( (int)10.5, 20);
double  b =max( (double  ) 10, 20.6);
 

模板函数的覆盖

 
下列函数模板:
       template <typename T>
       T max(T a, T b)
       {
             retum a>b?a:b;
       }
       对于支持运算符“>”的数据类型,如整型、实型、字符型、string数据,这个模板能够正常工作。对于不支持运算符“>”的数据类型,譬如C字符串类型,用上述模板就会出现问题,因此要为其编写独立的max()函数。
 
       我们将函数模板生成的函数称为模板函数。如果某一函数的函数原型与函数模板生成的函数(模板函数)原型一致,则称该函数为模板函数的覆盖函数。
 
在进行函数调用时,编译程序采用如下策略确定调用哪个函数:
(1)首先寻找一个实参与形参完全匹配的普通函数,如果找到,则调用该函数;
(2)如果能通过函数模板实例化生成模板函数,并且参数匹配,则调用该函数;
(3)如果所有努力失败,则给出出错信息。