Posted on 2007-08-30 10:47
宝杉 阅读(206)
评论(0) 编辑 收藏 引用 所属分类:
C++
模板是重用机制的一种工具,可以实现类型参数化,即把类型定义为参数,实现代码可重用性。
F:宏定义也可以实现重用,为什么不使用宏?
Q:宏避开C++类型检查机制,两个不同类型参数之间的比较将会导致错误。
模板,模板函数,模板类和对象之间的关系。
箭头代表实例化
![](http://www.cppblog.com/images/cppblog_com/robinson119/template.jpg)
例如:
C++exams\template_max
模板形参将T实例化的参数。
函数模板是一个不完全的函数,首先需要将模板形参T实例化为确定的类型。这个类型可以是预定义的,也可以是用户自定义。
模板函数的异常
1 先调用顺序遵循什么约定?
(1)寻找类型完全匹配的函数。
(2)寻找函数模板,实例化后,产生匹配的模板函数。
(3)若(1)(2)失败,尝试低一级的对函数重载的方法。例如,通过类型转换。
(4)(1)(2)(3)都为匹配,则是一个错误。
2 先了解了这样的约定,就很容易理解以下:
用非模板函数重载函数模板,只声明非模板类函数的原型,不给出函数体,而函数体借用函数模板的函数体。
例如:
template <class T>
T max( T x, T y)
{
return( x > y )? x : y;
}
int max( int, int);
//int max 重载了函数模板的函数体;
int i;
char c;
max(i, c);
3 定义一个完整的有函数体的非模板函数。
比如:max(char, char)时,上面的函数模板不能比较比一个字符更长的字符串了。
所以,像一般的重载函数一样定义。
char *max( char *x, char *y )
{
return ( strcmp(x, y) > 0 ) ? x :y;
}
char * max重载了函数模板,当调用为:
max ( “abcd”, “efgh” ); 将执行此函数。