2011-04-22 5 views
4

람다를 함수에 전달하고 싶습니다. 람다는 매개 변수가 있다면매개 변수를 사용하여 람다 전달하기

boost::function<void()> fncPtr(boost::bind<void>([](){/* something */})); 

작동하지만, 나는 그것을 제대로하는 방법을 모른다 :

boost::function<void(bool)> 
fncPtr(boost::bind<void,bool>([](bool){/* something */}, _1)); 

이 작동하지 않습니다.

내가 잘못 했나요? 인수로 람다를 전달하는 방법은 무엇입니까?

저는 이것을 회원 함수에서하고 싶습니다. "전역 범위"(이름이 맞습니까?) 위의이 메서드는 잘 작동합니다.

+0

함수의 매개 변수는 무엇입니까? – Xeo

+0

음, 음, 왜 이것이 작동하지 않는지도 모르겠습니다. (물론, 사소한 경우에,'bind'에 람다를 감싸는 필요는 없습니다. 그러나 그 점은 거의 아닙니다.) –

답변

0

아마 컴파일러에 문제가 있습니다. Visual Studio 2010에서도 오류가 발생했습니다. 컴파일러가 람다를 도우미 함수를 사용하여 함수로 변환하도록 도울 수 있습니다.

template <typename T> 
void closureToFunction(bool x){ T f; return f(x); } 

int main() 
{ 
    auto exp = [](bool x){/* something */}; 
    boost::function<void(bool)> fncPtr( 
     boost::bind(closureToFunction<decltype(exp)>, _1)); 
    return 0; 
} 
2

몇 가지 기술을 요약했습니다. . 참고로, 저는 C++ 0x 버전을 사용했습니다. Boost 버전도 잘 작동합니다.
정말 당신의 기능이 매개 변수로 원하는 것에 달려 있습니다. 단순히 템플릿으로 작성하거나 (std::|boost::)function을 사용하면 간단한 람다가 처리합니다. 복잡한 바인딩이나 포장을 할 필요가 없습니다. (std::|boost::)function.

+1

C++ 0x 버전은 여분의''이 필요하지 않습니다. 'bind'는 리턴 타입을'result_of :: type' (또는 유사한 것)으로 선언합니다. boost는 리턴 타입을 추론하기 위해'decltype'과 같은 모든 반짝이는 것들을 가지고 있지 않으므로 람다가 제공하지 않는 펑터에 의해 제공되는'result_type' typedef에 달려 있습니다. –

+0

@Johannes : 감사합니다. 람다가 제공하지 않는다는 것을 아는 것은 재미 있습니다. 그 이유에 대한 근거는 무엇입니까? 'decltype' 때문에 C++ 0x에서는 더 이상 필요하지 않기 때문에? – Xeo

3

이 GCC4.5과 나를 위해 잘 작동 :

#include <boost/bind.hpp> 
#include <boost/function.hpp> 

int main() { 
    boost::function<void(bool)> 
    fncPtr(boost::bind<void>([](bool){/* something */}, _1)); 
} 

그것은 매개 변수의 유형을 필요로하지 않는다. 이러한 매개 변수 유형은 어쨌든 (일부 펑터의 경우) 템플리트 될 수 있으므로 일반적으로 매개 변수 유형에 의존 할 수 없습니다. 반환 형식 만 있으면됩니다.

덧붙여 말하자면, 심지어 <void, bool>을 통과 할 때, 심지어 람다에 캡쳐가 없을 때만 작동합니다. 나는 GCC4.5가 lambdas가 capture 절을 가지고 있지 않을 때, 함수 포인터 타입으로 lambda의 변환을 지원하기 때문에 이것이 나에게 도움이 될 것이라고 생각한다. <void, bool>bind에 함수 포인터를 허용하는 후보를 가지게하고, 람다를 그 포인터로 변환합니다. 귀하의 컴파일러는 분명히 특별 변환을 아직 지원하지 않습니다 (그러나 FDIS는 그것을 요구합니다).

따라서 <void> 만 전달하면 제대로 작동합니다.

관련 문제