2013-10-27 36 views
3

我想實現一個獲取Lambda回調作爲參數的C++函數。事情是,回調是從同一個(被調用的)類中的另一個函數異步啓動的。因此,我需要將Lambda存儲在成員變量中,以便可以通過需要啓動回調的異步函數來訪問它。將C++ Lambda存儲在要用作回調的成員變量中?

我嘗試了所有可以想到的方式來使用成員變量聲明,設置和調用Lambda,但代碼始終在作業或調用中崩潰。

這是我正在嘗試做的一個精簡版本。

聲明功能:

void function(const std::function<void()>callback); 

調用從主代碼的函數:

myClass->function([](){cout << "Callback called";}); 

如果我從內function它工作正常執行callback,但我無法找到一個方法來將其存儲在成員變量(例如m_callback)中,並從同一類的另一個函數調用它。

回答

5

這應該工作:

#include <functional> 
#include <utility> 

struct MyThing 
{ 
    std::function<void()> f_; 

    void SetCallback(std::function<void()> f) { f_ = std::move(f); } 

    void Action() { f_(); } 
}; 

用法:

#include <iostream> 

MyThing thing; 

thing.SetCallback([](){ std::cout << "Boo\n"; }); 
thing.Action(); 
+0

這個工作正常(即使在第二個異步函數中),當Lambda被定義爲內聯的時候,就像你的例子。但是,如果Lambda是傳遞給函數的參數,那麼thing.Action()僅適用於函數本身。它在異步函數中導致EXC_BAD_ACCESS。 –

+2

@AmiramStark:你的問題幾乎可以保證是由於對對象生命週期和同步的不完全理解。然而,如果沒有一個更具代表性的例子,你很難給出任何建議,除了「寫出正確的代碼」恐怕。 –

1

只需創建一個std ::函數的變量,並調用它。

#include <iostream> 
#include <functional> 

struct A{ 
    std::function<void()> cb; 

    void function(const std::function<void()>callback){ 
     cb=callback; 
    } 
}; 

int main() { 
    A a; 

    a.function([](){std::cout << "Callback called";}); 

    a.cb(); 

} 
+0

我試過了。當我在異步函數中調用cb時,我得到了一個SIGSEGV(當然,main仍然是活動的)。這發生在Xcode和Eclipse中。 –

+0

@AmiramStark和哪個編譯器?異步函數是什麼意思? –

+0

在Xcode中,它是Apple LLVM 4.2。在Eclipse中,它是最新的內置GCC編譯器,我不知道版本。至於異步函數,我在原來的問題中解釋了這一點。我從將它作爲參數傳遞到的函數中調用Lambda沒有任何問題。但是我需要將它存儲在類成員變量中,並且可以異步地從另一個函數中調用它(例如,當用戶觸摸按鈕或超時回調時)。 –

相關問題