1
用宏扩展机制实现的函数,虽然没有类型的限制,但是有一定的危险,比如调用时传入p++等,可能出错。
如:
#define min(a,b) ((a) < (b) ? (a) : (b))
调用 min (data1++, data2) 就有副作用。
2
如同非模板函数一样 函数模板也可以被声明为inline 或extern 应该把指示符放在模
板参数表后面 而不是在关键字template 前面
// ok: 关键字跟在模板参数表之后
template <typename Type>
inline
Type min( Type, Type );
// 错误: inline 指示符放置的位置错误
inline
template <typename Type>
Type min( Array<Type>, int );
3
函数模板指定了怎样根据一组或更多实际类型或值构造出独立的函数 这个构造过程被
称为模板实例化 template instantiation 这个过程是隐式发生的 它可以被看作是函数模
板调用或取函数模板的地址的副作用 例如 在下面的程序中 min()被实例化两次 一次是
针对5 个int 的数组类型 另一次是针对6 个double 的数组类型
// 函数模板 min() 的定义
// 有一个类型参数 Type 和一个非类型参数 size 412 第十章 函数模板
template <typename Type, int size>
Type min( Type (&r_array)[size] )
{
Type min_val = r_array[0];
for ( int i = 1; i < size; ++i )
if ( r_array[i] < min_val )
min_val = r_array[i];
return min_val;
}
// size 没有指定——ok
// size = 初始化表中的值的个数
int ia[] = { 10, 7, 14, 3, 25 };
double da[6] = { 10.2, 7.1, 14.5, 3.2, 25.0, 16.8 };
#include <iostream>
int main()
{
// 为 5个 int的数组实例化 min()
// Type => int, size => 5
int i = min( ia );
if ( i != 3 )
cout << "??oops: integer min() failed\n";
else cout << "!!ok: integer min() worked\n";
// 为 6 个 double 的数组实例化 min()
// Type => double, size => 6
double d = min( da );
if ( d != 3.2 )
cout << "??oops: double min() failed\n";
else cout << "!!ok: double min() worked\n";
return 0;
}
调用
int i = min( ia );
被实例化为下面的min()的整型实例 这里Type 被int size 被5 取代
int min( int (&r_array)[5] )
{
int min_val = r_array[0];
for ( int ix = 1; ix < 5; ++ix )
if ( r_array[ix] < min_val )
min_val = r_array[ix];
return min_val;
}
类似地 调用
double d = min( da );
也实例化了min()的实例 这里Type 被double size 被6 取代