2011-04-21 4 views
0

나는이 기능을 가지고있다. 그러나 멤버 함수 나 멤버 함수에 정의 된 람다를 전달할 수는 없습니다.콜백 매개 변수는

void class::memberFunc() { 
void func((void(*)(float))([](float m){})); 
} 

을하지만 람다는 통화에서 무시처럼 보인다 :

나는 이런 식으로 뭔가를 캐스팅했습니다. 그리고 멤버 함수를 어떻게 넘겨 줄지 전혀 모르겠습니다.

struct T { 
    T(int x) : x(x) {}; 
    void foo() { 
     std::cout << x; 
    } 

    int x; 
}; 

객체 포인터 기능에 내재 된 첫 번째 매개 변수이며, boost::function를 처리 할 때이 명시된다 :

+0

C++ lambdas는 함수가 아니라 함수 객체이므로 람다를 함수 포인터로 캐스트하면 정의되지 않은 동작이 발생합니다. – ildjarn

+0

좋아, 그래서 함수에 람다를 전달하는 방법? –

+0

@ user408141 : 함수를 템플릿으로 만들거나 (전달할 내용을 모르거나 신경 쓰지 않아도 됨) 함수가 적절한 서명의'std :: function <>'을 취하도록합니다. – ildjarn

답변

1

을 감안할 때.

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

int main() { 
    T t(42); 
    func(boost::bind(&T::foo, &t)); 
} 

또는 그렇지 않으면 늦게 바인딩 할 수 있습니다 :

당신은 조기를 결합함으로써 func에서 "숨길"수

T t(42); 

void func(boost::function<void(T*)> cb) { 
    cb(&t); 
} 

int main() { 
    func(boost::bind(&T::foo, _1)); 
} 

그것이 here 작업을 참조하십시오.