少跟進此:C++ lambda function without C++0x?如何函數對象傳遞給函數回調C++
我所創建的lambda函數作爲一個函數對象沒有C0X
現在的問題是:
- 如何將它作爲回調/函數指針傳遞給另一個函數?
我的第一次嘗試是這樣的,但它沒有工作:
Lambda Obj(C, D);
command (Obj.operator()(typeA A, typeB B));
我打上了別的問題要早我猜,所以沒有人看着的編輯。
少跟進此:C++ lambda function without C++0x?如何函數對象傳遞給函數回調C++
我所創建的lambda函數作爲一個函數對象沒有C0X
現在的問題是:
我的第一次嘗試是這樣的,但它沒有工作:
Lambda Obj(C, D);
command (Obj.operator()(typeA A, typeB B));
我打上了別的問題要早我猜,所以沒有人看着的編輯。
如果你不能找到std::tr1::function
或通過std::function
或通過編譯器升級std::function
...
寫自己的std::function
樣型橡皮擦,或使用boost
,或使用「以最快的代表們(應該谷歌到一個完整的實現),或者通過一個this
指針和一個方法指針作爲template
-type-deduced參數給一個函數,或者傳遞函數對象的一個template
類型推導的副本給函數。
請注意,最後兩個選項需要暴露函數的主體(例如在頭文件中)。
或將函數對象轉換爲void*
樣式的C回調。
我會用C++ 11,並且如果失敗boost
,並且沒有那個快速的委託,那麼我自己寫一個類型橡皮擦,在頭文件和模板中失敗那個棒體+傳遞一個副本(除非函數很簡單,在這種情況下,首先這樣做),並且失敗那個龐大的C風格。
+1這個答案中的雙重節奏非常棒。 – WhozCraig 2014-08-30 12:35:57
使用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);
謝謝,我想第二個,它編譯。 – joey 2014-08-30 10:55:29
只需使用C++ 11編譯器即可。對於這樣的事情,查看早期的C++編譯器已經過時了。 – 2014-08-30 09:00:46
@BasileStarynkevitch:只要它一直如此簡單。公司不願意升級編譯器,也不可能有一位禁止C++ 11的老闆。 – 2014-08-30 09:03:51
我沒有選擇。 – joey 2014-08-30 09:17:57