用参数传递lambda

时间:2011-04-22 13:20:48

标签: c++ boost lambda c++11

我想将一个lambda传递给一个函数。

这个

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

有效,但如果lambda有参数,我不知道如何正确地做到这一点:

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

不起作用。

我哪里错了? 如何使用参数传递lambda?

我想在成员函数中执行此操作。 那么在“全局范围”(它的名称是什么?)上面这个方法运行正常。

3 个答案:

答案 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;
}