2013-10-27 3 views
3

매개 변수로 람다 콜백을 가져 오는 C++ 함수를 구현하려고합니다. 문제는 콜백이 동일한 (호출 된) 클래스의 다른 함수에서 비동기 적으로 시작된다는 것입니다. 따라서 Lambda를 멤버 변수에 저장하여 콜백을 시작해야하는 비동기 함수에 액세스 할 수 있도록해야합니다.C++ Lambda를 콜백으로 사용할 멤버 변수에 저장 하시겠습니까?

멤버 변수를 사용하여 Lambda를 선언하고 설정하고 호출하는 방법을 모두 시도했지만 코드가 할당 또는 호출에서 항상 충돌합니다.

다음은 내가 수행하려고 시도한 것의 제거 된 버전입니다. 메인 코드에서 함수 호출

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

:

함수를 선언 나는 그것이 잘 작동 function 내에서 callback을 실행하면

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

을,하지만 난 할 수있는 방법을 찾을 수 없습니다 그것을 구성원 변수 (예 : 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가 함수에 전달 된 매개 변수이면 thing.Action()은 함수 자체에서만 작동합니다. 비동기 함수에서 EXC_BAD_ACCESS가 발생합니다. –

+2

@AmiramStark : 문제는 오브젝트 수명과 동기화에 대한 불완전한 이해 때문에 거의 보장됩니다. 그러나, 당신이하려고하는 것에 대한 더 대표적인 예가 없으면 "올바른 코드 작성"이외의 조언을하기가 어렵습니다. –

1

는 그냥 표준 : 기능 변수를 생성하고 호출합니다.

#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를 얻습니다. 이것은 Xcode와 Eclipse 모두에서 발생합니다. –

+0

@AmiramStark 및 컴파일러는 무엇입니까? 비동기 함수 란 무엇입니까? –

+0

Xcode에서 Apple LLVM 4.2입니다. 이클립스에서는 최신 GCC 컴파일러가 내장되어있어 버전을 모른다. 비동기 함수에 관해서는 원래 질문에서 설명했습니다. 함수에서 매개 변수로 전달되는 Lambda를 호출하는 데 아무런 문제가 없습니다. 하지만 클래스 멤버 변수에 저장하고 비동기 적으로 다른 함수에서 호출해야합니다 (예 : 사용자가 버튼을 터치하거나 콜백에서 제한 시간 초과). –