C++ 带参数传递lambda
我想把lambda传递给function 这个 函数fncPtr(boost::bind([](){/*something*/})); 工作正常,但如果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
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;
}