1
#include <iostream>
#define min(a,b) ((a) < (b) ? (a) : (b))
const int size = 10;
int ia[size];
int main() {
int elem_cnt = 0;
int *p = &ia[0];
// 计数数组元素的个数
while ( min(p++,&ia[size]) != &ia[size] )
++elem_cnt;
cout << "elem_cnt : " << elem_cnt
<< "\texpecting: " << size << endl;
return 0;
}
这个程序给出了计算整型数组 ia 的元素个数的一种明显绕弯的的方法.min()的宏扩展在这种情况下会失败,因为应用在指针实参 p 上的后置递增操作随每次扩展而被应用了两次.执行该程序的结果是下面不正确的计算结果:
elem_cnt : 5 expecting: 10
2 模板参数可以是一个模板类型参数,它代表了一种类型;也可以是一个模板非类型参数,它代表了一个常量表达式。
模板类型参数由关键字class或typename后加一个标识符构成。在函数的模板参数表中,这两个关键字的意义相同。他们表示后面的参数名代表一个潜在的内置或用户定义的类型。模板参数名可以任意选择。
template<class Glorp>
Glorp min(Glorp a,Glorp b)
{
return a<b? a:b;
}
模板非类型参数由一个普通的参数声明构成。模板非类型参数表示该参数名代表一个潜在的值,而该值代表了模板定义中的一个常量。
template <class Type, int size>
Type min( const 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;
}
转载于:https://www.cnblogs.com/wangtianxj/archive/2009/07/27/1532293.html