|
這里用一個(gè)簡單的代碼片段來說明偽函數(shù)的實(shí)現(xiàn)和用法,及其優(yōu)點(diǎn)。代碼示例如下: class Abs { public: int operator()(int num)const; //這個(gè)操作符的重載是實(shí)現(xiàn)偽函數(shù)的關(guān)鍵 Abs(); void setIsOpponent(bool isOpponent); private: bool isOpponent; }; //關(guān)鍵方法 int Abs::operator()(int num)const { int res; if(!isOpponent) { res = num > 0 ? num : -num; } else { res = num > 0 ? -num : num; } return res; } Abs::Abs() { isOpponent = false; } void Abs::setIsOpponent(bool aIsOpponent) { isOpponent = aIsOpponent; } 我們可以看到,由于Abs類實(shí)現(xiàn)了一個(gè)"()"操作符,這樣就允許把這個(gè)類像函數(shù)一樣使用。 我們把這樣的類稱為函數(shù)對(duì)象,或稱做偽函數(shù)。
使用示例如下: Abs myAbs; myAbs.setIsOpponent(true); //進(jìn)行相反操作。 int value = myAbs(-23); //這里如同把myAbs實(shí)例當(dāng)作一個(gè)函數(shù)來使用。
優(yōu)點(diǎn):使用仿函數(shù)就像使用一個(gè)普通的函數(shù)一樣,但是它的實(shí)現(xiàn)可以訪問仿函數(shù)中所有的成員變量來進(jìn)行通行;而普通函數(shù)若要通信就只能依靠全局變量了。 (http://blog./u3/90609/showart_1811637.html)
Bjarne: 什么是函數(shù)對(duì)象?
顧名思義,就是在某種方式上表現(xiàn)的象一個(gè)函數(shù)的對(duì)象。典型的,它是指一個(gè)類的實(shí)例,這個(gè)類定義了應(yīng)用操作符operator()。 函數(shù)對(duì)象是比函數(shù)更加通用的概念,因?yàn)楹瘮?shù)對(duì)象可以定義跨越多次調(diào)用的可持久的部分(類似靜態(tài)局部變量),同時(shí)又能從對(duì)象的外面進(jìn)行初始化和檢查(和靜態(tài)局部變量不同)。例如: class Sum { int val; Sum(int i):val(i) {} operator int() const { return val; } // 取得值 int operator()(int i) { return val+=i; } // 應(yīng)用 }
注意:一個(gè)擁有應(yīng)用操作符的函數(shù)對(duì)象可以被完美地內(nèi)聯(lián)化(inline),因?yàn)樗鼪]有涉及到任何指針,后者可能導(dǎo)致拒絕優(yōu)化。與之形成對(duì)比的是,現(xiàn)有的優(yōu)化器幾乎不能(或者完全不能?)將一個(gè)通過函數(shù)指針的調(diào)用內(nèi)聯(lián)化。 在標(biāo)準(zhǔn)庫中,函數(shù)對(duì)象被廣泛的使用以獲得彈性。 (http://hi.baidu.com/ilotus_y/blog/item/7a1044d3b23f6fdaa9ec9a87.html) |
|
|