c++ - 如何返回带参数的 lambda 函数?

标签 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

最佳答案

除了 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/

相关文章:

visual-studio-2013 - Visual Studio添加始终运行的预构建事件(C#项目)

c++ - 如何在 Visual Studio 2013 中动态包含库

c++ - std::find 是否隐式修复无效参数?

C++ boost::multi_array 索引太大

c++ - 断言失败时如何打印附加信息?

c++ - 为什么 lambda 中的变量捕获如此复杂?

java - 为什么 Java Integer.MIN_VALUE 是 -2^31 而不是像 C++ 那样的 -2^31+1

c++ - std::move 和 static_cast<T&&> 不同的结果

c++ - std::thread 不是全局变量,但在到达创建它的函数的末尾时不会超出范围?

c++ - 使用 Cmake 和 Visual Studio 2013 Unresolved external 问题