effective c++读书笔记——用内联模板函数替换类似函数的宏定义

我们来看下面宏定义:
           #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))

这般长的宏有着太多缺点,光是想到它们就让人痛苦不堪。无论何时当你写出这种宏,你必须记住为宏中的所有实参加上小括号,否则某些人在表达式中调用这个宏时可能会遭遇麻烦。但是纵使你为所有实参加上小括号,看看下面不可思议的事情:

int a = 5, b = 0;

CALL_WITH_MAX(++a, b);      //a被累加两次

CALL_WITH_MAX(++a, b+10);//a被累加一次

在这里调用f之前,a的递增次数竟然取决于"他被拿来和谁比较"!

幸运的是你不需要对这种无聊的事情提供温床。你可以获得宏带来的效率以及一般函数的所有可预料行为和类型安全性——只要你写出template inline函数

template <typename T>

inline void callWithMax(const T& a, const T& b)

{
    f(a > b ? a : b);
}

这个template产出一整群函数,每个函数都接受两个同类型的对象,这里不需要在函数本体中为参数加上括号,也不需要操心参数被核算(求值)多次......等等。此外犹豫callWithMax是个真正的函数,他遵守作用域(scope)和访问规则。例如你绝对可以写出一个"class 内的private inline 函数"。一般而言,宏无法完成此事。

对于形似函数的宏(macros),最好改用inline函数代替#define。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值