我有一个函数模板,它接受一个可调用对象,包括如下所示的 lambda
template<class ValueT, class ValidatorF>
void myFun(ValueT& value, ValidatorF validate)
{
...
if (validate(value)) ... // call to validate the value
...
}
我可以像下面这样使用验证器来测试整数是否大于 0
int i = 10;
myFun(i, [](int& value) {return value > 0;});
现在我想要一个验证器来测试一个整数是否大于一个特定的数字(不仅仅是 0),我这样做
auto greaterThan = [](int number)
{ return [number](int& value) { return value > number; }; };
但是上面不能用VS2013编译。有什么错误或让它工作的方法吗?
我刚刚在 Coliru 测试过。没关系。也许这是由于 VS2013。通过测试
int main()
{
auto greaterThan = [](int number)
{ return [number](int& value) { return value > number; }; };
}
VS2013编译报错是
Error 1 error C2440: 'return' : cannot convert from 'main::<lambda_20b9557a9ed9208edabcd15f35d83ad2>::()::<lambda_44761a42f06f1791bdbf89e7a9b3a961>' to 'bool (__cdecl *)(int &)' main.cpp 8
最佳答案
除了 ecatmur 所说的之外,您还可以决定实现 greaterThan 方法的非柯里化(Currying)版本并使用 std::bind绑定(bind)第二个参数:
auto greaterThan = [](int num1, int num2) -> { return num1 > num2; };
myFun(i, std::bind(greaterThan, _1, number) );
关于c++ - 如何返回带参数的 lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27527735/