函式物件 Function Objects

2021-04-13 03:08:07 字數 2588 閱讀 6825

c++必知必會 第18條款

有時候需要一些行為類似於函式指標的東西,但函式指標顯得笨拙、危險而且過時(讓我們承認這一點)。通常最佳方式是使用函式物件(function object)取代函式指標。

與智慧型指標(參見條款42"智慧型指標")一樣,函式物件也是乙個普通的類物件。智慧型指標型別過載->和*(可能還有->*)操作符,來模仿指標的行為;而函式物件型別則過載函式呼叫操作符(),來建立類似於函式指標的東西。考慮如下函式物件,它的每次呼叫都計算眾所周知的斐波納契數列(1、1、2、3、5、8、13,……)的下乙個元素值:

class fib
int operator ()();       //書的原著中缺少了乙個()
private:
int a0_, a1_;
};
int fib::operator ()()
函式物件就是常規的類物件,但是可以採用標準的函式呼叫語法來呼叫它的operator()成員(此成員可能具有多個過載版本)。

fib;

//……

std::cout << 「next two in series: 」 << fib()

<< 『 』 << fib() << std::endl;

fib()語法被編譯器識別為對fib物件的operator()成員函式的呼叫,這在意思上和fib.operator()等價,但看起來更簡潔。在這個例子中,使用函式物件而不是函式或函式指標的優勢在於,用於計算斐波納契數列下乙個值的狀態被儲存於fib物件自身之中。如果採用函式來實現計算功能,那麼必須求助於全域性或區域性靜態變數或其他一些基本的技巧,以便在函式呼叫之間保持狀態,或者將狀態資訊明確地傳遞給函式。還要注意的是,有別於使用靜態資料的函式,我們可以擁有多個同時計算的fib物件,且其計算過程和結果不會互相干擾。

int fibonacci ()
還有可能並且常見的是獲取虛函式指標的效果,這是通過建立乙個帶有虛擬operator()的函式物件層次結構而實現的。考慮乙個數值積分軟體,它用於計算曲線所包圍面積的近似值,如下圖所示:

numeric integration by summing areas of rectangles (simplified)

乙個積分函式可以對low和high之間的值反覆呼叫乙個函式,來近似計算曲線所包圍的面積,這是通過計算矩形面積的總和而實現的(當然也可以採用一些類似的機制):

typedef double (*f)( double );
double integrate( f f, double low, double high )
return area;
}
在這個版本中, 傳遞乙個函式指標來執行所期望的積分操作。

double afunc( double x )
//...
double area = integrate( afunc, 0.0, 2.71828 );
這可行,但不靈活,因為它使用乙個函式指標來指示待整合的函式。它不能處理需要狀態的函式或指向成員函式的指標。乙個替代的方式是建立乙個函式物件層次結構,該層次結構的基類是乙個簡單介面類,只宣告了乙個純虛operator()函式。

class func ;

double integrate(func &f, double low, double high);

現在integrate能夠與任何型別的func函式物件(--所謂」任何型別的func 函式物件」,中指任何型別的func派生類例項。)進行整合。還有乙個值得注意的有趣的地方,就是integrate函式體不需要進行任何修改(當然,重新編譯一遍是免不了的),因為我們使用與呼叫函式指標相同的語法來呼叫乙個函式物件。例如,可以從func派生出乙個可以處理非成員函式的型別:

class nmfunc : public func

double operator()(double d )

private:

double (*f_)(double);     //定義乙個函式指標成員 };

這就允許最初版本的integrate整合所有的函式:

double afunc( double x )
//...
nmfunc g( afunc );
double area = integrate( g, 0.0, 2.71828 );
通過為指向成員函式的指標和類物件包裝乙個適當的介面,還可以將成員函式整合進來(參見「指向成員函式的指標並非指標—條款16」):

template
class mfunc : public func
double operator ()( double d )
private:
c &obj_;
double (c::*f_)( double );
};
//...
aclass anobj;
mfuncf( anobj, &aclass::afunc );
double area = integrate( f, 0.0, 2.71828 );

函式物件 函式符

函式物件 函式符 很多stl演算法都使用函式物件,也叫函式符 functor 函式符是以函式方式與 結合使用的任意物件,如函式名 指向函式的指標 過載了 運算子的類物件 函式符概念 1.生成器 generator 是不用引數就可以呼叫的函式符 2.一元函式 unary function 是用乙個引數...

STL 函式物件 謂詞 預定義函式物件 函式介面卡

過載函式呼叫操作符的類,其物件常稱為函式物件 function object 即它們是行為類似函式的物件,也叫仿函式 functor 其實就是過載 操作符,使得類物件可以像函式那樣呼叫。注意 函式物件 仿函式 是乙個類,不是乙個函式。函式物件 仿函式 過載了 操作符使得它可以像函式一樣呼叫。分類 假...

c 之函式物件 謂詞 內建函式物件

函式物件概念 1 過載函式呼叫操作符的類,其物件稱為函式物件 2 函式物件使用過載的 時,行為類似與函式呼叫,也叫仿函式 本質 函式物件 仿函式 是乙個類,不是乙個函式 函式物件的使用 特點1 函式物件在使用時,可以向普通函式那樣呼叫,可以有引數,可以有返回值 2 函式物件超出普通函式的概念,函式物...