C++ 带参数传递lambda

C++ 带参数传递lambda,c++,boost,lambda,c++11,C++,Boost,Lambda,C++11,我想把lambda传递给function 这个 函数fncPtr(boost::bind([](){/*something*/})); 工作正常,但如果lambda有参数,我不知道如何正确执行: boost::function<void(bool)> fncPtr(boost::bind<void,bool>([](bool){/* something */}, _1)); boost::函数 fncPtr(boost::bind([](bool){/*somethi

我想把lambda传递给function

这个

函数fncPtr(boost::bind([](){/*something*/})); 工作正常,但如果lambda有参数,我不知道如何正确执行:

boost::function<void(bool)>
fncPtr(boost::bind<void,bool>([](bool){/* something */}, _1));
boost::函数
fncPtr(boost::bind([](bool){/*something*/},_1));
不起作用

我错在哪里? 如何通过参数传递lambda

我想在成员函数中执行此操作。
因此,在“全局范围”(是名称吗?)中,上述方法效果很好。

我总结了一些技术。注意,我使用的是C++0x版本,Boost版本也应该可以正常工作。

这实际上取决于函数作为参数想要什么。如果它只是模板化的,或者需要一个
(std::| boost::)函数
,那么一个简单的lambda就可以了。不需要在一个额外的
(std:| boost::)函数中进行复杂的绑定或打包

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

int main() {
  boost::function<void(bool)>
    fncPtr(boost::bind<void>([](bool){/* something */}, _1));
}
#包括
#包括
int main(){
boost::函数
fncPtr(boost::bind([](bool){/*something*/},_1));
}
它不需要参数的类型。这些参数类型无论如何都可以模板化(对于某些函子),因此通常不能依赖于它们。它只需要返回类型

顺便说一句,它甚至在我通过
时对我有效,但只有在lambdas没有捕获时才有效。我认为这可能对我有用,因为GCC4.5支持将lambdas转换为函数指针类型,而lambdas没有capture子句
将使
绑定
具有接受函数指针的候选对象,并使lambda转换为该函数指针。您的编译器显然还不支持这种特殊转换(但FDIS需要它)


所以,只需传递
,它就可以工作了

编译器可能有问题。我在VisualStudio2010中也有一个错误。您可以使用helper函数帮助编译器将lambda转换为函数:

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;
}
模板
void closureToFunction(boolx){tf;返回f(x);}
int main()
{
autoexp=[](boolx){/*something*/};
功能fncPtr(
boost::bind(closureToFunction,_1));
返回0;
}

函数的参数是什么?嗯,是的,我也不明白为什么这不起作用。(当然,在这个简单的例子中,不需要在
bind
中包装lambda;但这不是重点。)我认为C++0x版本不需要额外的
,因为它的
bind
将返回类型声明为::type
结果(或类似的东西)。boost没有像
decltype
那样的所有闪亮的东西来推断返回类型,因此它依赖于functor提供的
result\u type
typedef,而lambdas没有提供。@Johannes:谢谢,知道lambdas没有提供这些东西很有趣。为什么呢?仅仅是因为
decltype
,您不再需要C++0x使用它?
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;
}