2013-10-20 20 views
1

利用VC2012,編譯器會自動處理調用約定時,lambda函數與沒有捕獲列表中。 例如熱處理C++ 11拉姆達與這兩個指針捕獲和調用約定指定

EnumWindows([](HWND, LPARAM){ return TRUE; }, 0); // compile with no problem 

但是當我把這個指針指向捕獲列表時,它無法編譯。 例如

EnumWindows([this](HWND, LPARAM){ return my_class_member_function(); }, 0); // error 

有人可以讓我知道是否有辦法在lambda函數內調用成員函數嗎?

感謝,萬里

回答

5

只有那些沒有捕獲任何lambda表達式可以轉化爲函數指針和該API只接受指針。

你可以做的是通過lparam保持拉姆達無狀態和傳輸this

EnumWindows(
     [](HWND, LPARAM lparam){ 
      return reinterpret_cast<Your_Class*>(lparam)->my_class_member_function(); 
     }, 
     reinterpret_cast<LPARAM>(this)); 
+0

是(我已經upvoted你啦)。 – Angew

+0

該解決方案很酷且棘手,但不是通用的。也許下一個版本的C++ spec/impl會更加正確和流暢地處理它? –

+1

@MilesChen,這已經是可能的,定義新的API時接受'的std :: function'或任何可調用的類型(使用模板)。但是對於基於函數指針的接口,您需要以該接口支持的方式傳遞狀態。 – zch

1

只有無國籍的lambda函數可以被衰減到函數指針。當你添加狀態(通過捕獲this)你不再有這個能力。

2

的問題是不是與調用約定。問題是捕獲lambdas不提供指向函數的轉換,所以你不能傳遞這樣一個lambda表達式,其中需要指向函數的指針。