effective c++讀書筆記——用內聯模板函式替換類似函式的巨集定義
阿新 • • 發佈:2018-12-02
我們來看下面巨集定義:
#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。