這里用一個(gè)簡(jiǎn)單的代碼片段來說明偽函數(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.chinaunix.net/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;
public:
Sum(int i):val(i) {}
operator int() const { return val; } // 取得值
int operator()(int i) { return val+=i; } // 應(yīng)用
};
void f(vector v)
{
Sum s = 0; // initial value 0
s = for_each(v.begin(), v.end(), s); // 求所有元素的和
cout << "the sum is " << s << "/n";
//或者甚至:
cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "/n";
}
注意:一個(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)庫(kù)中,函數(shù)對(duì)象被廣泛的使用以獲得彈性。
(http://hi.baidu.com/ilotus_y/blog/item/7a1044d3b23f6fdaa9ec9a87.html)
聯(lián)系客服