2014-08-30 104 views
1

少跟進此:C++ lambda function without C++0x?如何函數對象傳遞給函數回調C++

我所創建的lambda函數作爲一個函數對象沒有C0X

現在的問題是:

  • 如何將它作爲回調/函數指針傳遞給另一個函數?

我的第一次嘗試是這樣的,但它沒有工作:

Lambda Obj(C, D); 
command (Obj.operator()(typeA A, typeB B)); 

我打上了別的問題要早我猜,所以沒有人看着的編輯。

+1

只需使用C++ 11編譯器即可。對於這樣的事情,查看早期的C++編譯器已經過時了。 – 2014-08-30 09:00:46

+0

@BasileStarynkevitch:只要它一直如此簡單。公司不願意升級編譯器,也不可能有一位禁止C++ 11的老闆。 – 2014-08-30 09:03:51

+0

我沒有選擇。 – joey 2014-08-30 09:17:57

回答

2

如果你不能找到std::tr1::function或通過std::function或通過編譯器升級std::function ...

寫自己的std::function樣型橡皮擦,或使用boost,或使用「以最快的代表們(應該谷歌到一個完整的實現),或者通過一個this指針和一個方法指針作爲template -type-deduced參數給一個函數,或者傳遞函數對象的一個​​template類型推導的副本給函數。

請注意,最後兩個選項需要暴露函數的主體(例如在頭文件中)。

或將函數對象轉換爲void*樣式的C回調。

我會用C++ 11,並且如果失敗boost,並且沒有那個快速的委託,那麼我自己寫一個類型橡皮擦,在頭文件和模板中失敗那個棒體+傳遞一個副本(除非函數很簡單,在這種情況下,首先這樣做),並且失敗那個龐大的C風格。

+0

+1這個答案中的雙重節奏非常棒。 – WhozCraig 2014-08-30 12:35:57

1

使用Boost.Bind

void command(boost::function<void()> func) 
{ 
    func(); 
} 

Lambda Obj(C, D); 
command(boost::bind<void>(Obj, A, B)); 

(或者也許你想有):

void command(boost::function<retType(typeA, typeB)> func) 
{ 
    retType ret = func(A, B); 
} 

Lambda Obj(C, D); 
command(boost::bind<retType>(Obj, _1, _2)); // placeholders 

使用模板(該STL的方式):

template <typename F> 
void command(F func) 
{ 
    func(A, B); 
} 

Lambda Obj(C, D); 
command(Obj); 

Live demo link.

+0

謝謝,我想第二個,它編譯。 – joey 2014-08-30 10:55:29