Posted by: kevinlin on: 六月 4, 2009
仿函數跟callback函數很類似,但是有本質上的不太一樣
仿函數似乎就是把Struct或Class假裝成一個函式的樣子。
舉個例,有這樣的一個struct
struct test
{
int a;
int b;
}
有個sort排列要求按a的大小來排,就是
struct sortfunction
{
bool operator()( const test &ta, const test &tb )
{return ta.a < tb.a; }
}
接著就能這樣使用了
std::vector<test > v;
std:: sort( v.begin(), v.end(), sortfunction() )
為什麼不把sortfunction直接寫成一個Function就好,也是可以,但是以類或者結構來處理可以得到更多彈性。
如果可以用仿函數實現,那麼你應該用仿函數,而不要用CallBack。原因在於:
仿函數技術可以獲得更好的性能,這點直觀來講比較難以理解。你可能說,CallBack函數都寫成inline了,怎麼會性能比仿函數差?我們這裡來分析下。我們假設某個函數func(例如上面的std::sort)調用中傳遞了一個CallBack函數,那麼可以分為兩種情況:
話又說回來了,仿函數並不能完全取代CallBack函數所有的應用場合。例如,我在std::AutoFreeAlloc中使用了CallBack函數,而不是仿函數,這是因為AutoFreeAlloc要容納異質的解構函數,而不是只支持某一種類的解構。這和模板(template)不能在同一個容器中支持異質類型,是一樣的。
最近的回應