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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FlayHigherGT/article/details/83895853

我们来看下面宏定义:
           #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。

 

猜你喜欢

转载自blog.csdn.net/FlayHigherGT/article/details/83895853