传递带有参数的lambda

Passing lambda with parameter

本文关键字:lambda 参数      更新时间:2023-10-16

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

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

工作,但如果lambda有一个参数,我不知道如何正确地做:

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

不工作

我错在哪里?如何传递lambda与参数(s)?

我想在成员函数中这样做。所以在"全局作用域"(这是它的名字吗?),上面的方法工作得很好。

这对我来说很好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>时,它甚至对我有效,但只有当lambdas没有捕获时。我认为这可能对我有用,因为GCC4.5支持lambdas转换为函数指针类型,当lambdas没有捕获子句时。<void, bool>将使bind有一个接受函数指针的候选,并使lambda转换为该候选。您的编译器显然还不支持这种特殊的转换(但是FDIS需要)。

所以,只要传递<void>,它应该工作。

我在Ideone上总结了一些技巧。注意,我使用的是c++ 0x版本,Boost版本应该也可以正常工作。这取决于你的函数想要什么作为参数。如果它是简单的模板化或接受(std::|boost::)function,那么一个简单的lambda就可以了。无需在额外的(std::|boost::)function中进行复杂的绑定或包装。

编译器可能有问题。我在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;
}