笔记六 函数模板

本文探讨了使用模板参数和宏定义进行数组元素计数的方法,并指出宏定义存在的问题。同时介绍了模板参数的两种形式:模板类型参数和模板非类型参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值