我想将一个lambda传递给一个函数。
这个
boost::function<void()> fncPtr(boost::bind<void>([](){/* something */}));
有效,但如果lambda有参数,我不知道如何正确地做到这一点:
boost::function<void(bool)>
fncPtr(boost::bind<void,bool>([](bool){/* something */}, _1));
不起作用。
我哪里错了? 如何使用参数传递lambda?
我想在成员函数中执行此操作。 那么在“全局范围”(它的名称是什么?)上面这个方法运行正常。
答案 0 :(得分: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>
时,它甚至对我有用,但只有当lambda没有捕获时。我认为这可能对我有用,因为当lambdas没有capture子句时,GCC4.5支持将lambda转换为函数指针类型。 <void, bool>
会使bind
有一个接受函数指针的候选者,并使lambda转换为该函数。您的编译器显然不支持该特殊转换(但FDIS需要它)。
所以,只需通过<void>
,它就可以了。
答案 1 :(得分:2)
我总结了一些技巧here on Ideone。注意,我使用的是C ++ 0x版本,Boost也应该可以正常工作
这实际上取决于你的函数想要什么作为参数。如果它只是模板化或需要(std::|boost::)function
,那么一个简单的lambda就可以了。额外的(std::|boost::)function
无需复杂的绑定或打包。
答案 2 :(得分:0)
您可能在编译器中遇到问题。我在Visual Studio 2010中也有错误。您可以帮助编译器使用辅助函数将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;
}