如何使用参数返回lambda函数?

时间:2014-12-17 14:23:34

标签: c++ c++11 visual-studio-2013 lambda

我有一个函数模板,它接受一个可调用的对象,包括一个如下所示的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

2 个答案:

答案 0 :(得分:4)

是的,这是MSVC的一个缺陷;它不能使用非空捕获列表处理返回类型推导到lambda。

以低效率为代价,您可以使用std::function来键入 - 擦除lambda:

#include <functional>

int main()
{
    auto greaterThan = [](int number) -> std::function<bool(int&)>
        { return [number](int& value) -> bool { return value > number; }; };
}

答案 1 :(得分:4)

除了ecatmur所说的,你可以决定实现你的bigThan方法的一个未经验证的版本,并使用std::bind绑定第二个参数:

auto greaterThan = [](int num1, int num2) -> { return num1 > num2; };
myFun(i, std::bind(greaterThan, _1, number) );