传递带有参数的lambda
Passing lambda with parameter
我想传递一个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;
}
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用自动推导的 lambda 参数作为常量表达式
- 如何参数化用作另一个 lambda 参数的 lambda
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 从成员函数签名中自动推导lambda参数
- Clang声称通用lambda参数的constexpr成员不是constexpr
- 如果我的模板类型首先以lambda参数而发生,则MSVC会引起一个奇怪的错误
- 继承类中没有匹配的泛型委托作为 lambda 参数
- 为什么在lambda参数中不允许自动
- 如何定义通用 lambda 参数的模板参数?
- 在 QGraphicsScene 中拖动 QPixmap:如何避免 lambda 参数中不允许'auto'
- variadic模板函数会以相反的顺序调用lambda参数
- 可变模板lambda参数的模板推导
- 嵌套模板功能中的C 0x lambda参数
- 带有 std::函数和 lambda 参数的分段错误
- 从值捕获的变量分配到lambda参数时,GCC编译器分割故障
- 标准::p空气的通用 lambda 参数
- C++ lambda 参数列表
- 我的 lambda 参数真的在阴影我的当地人吗?
- 从常量和引用的角度来看,函数应该如何接受*lambda*参数