C++ 如何返回带有参数的lambda函数?

C++ 如何返回带有参数的lambda函数?,c++,c++11,visual-studio-2013,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),我

我有一个函数模板,它接受一个包含lambda的可调用对象,如下所示

template<class ValueT, class ValidatorF>
void myFun(ValueT& value, ValidatorF validate)
{
    ...
    if (validate(value)) ... // call to validate the value
    ...
}
现在我需要一个验证程序来测试一个整数是否大于一个特定的数字(不仅仅是0),我需要

但上述内容无法使用VS2013编译。有什么错误或方法让它工作吗

我刚在科里鲁测试过。没关系。也许这是因为VS2013。通过测试

int main()
{
    auto greaterThan = [](int number) 
                       { return [number](int& value) { return value > number; }; };
}
VS2013编译错误为

错误1错误C2440:“返回”:无法从“main::()::”转换为“bool(u cdecl*)(int&)”main.cpp 8


是的,这是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; }; };
}
#包括
int main()
{
自动大于=[](整数)->std::函数
{return[number](int&value)->bool{return value>number;};};
}

是的,这是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; }; };
}
#包括
int main()
{
自动大于=[](整数)->std::函数
{return[number](int&value)->bool{return value>number;};};
}

除了ecatmur所说的之外,您还可以决定实现greaterThan方法的未绑定版本,并使用该版本绑定第二个参数:

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

除了ecatmur所说的之外,您还可以决定实现greaterThan方法的未绑定版本,并使用该版本绑定第二个参数:

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

你需要一个分号<代码>返回[number](int&value){return value>number;}
;(除非您只是键入了它,否则这可能不是您真正的问题。)您的编译错误是什么?可能lambda表达式需要返回类型:[](int number)->bool。。。。据我所知,在MSVC的某些版本中,返回类型需要明确定义。谢谢。这是一个输入错误。@user1899020正如已经询问过的那样,请提供编译器错误。如果我们甚至不知道编译器为什么不高兴,我们就不能很容易地帮助您找到解决方法;自动f=大于(10)(i)您需要一个分号<代码>返回[number](int&value){return value>number;};(除非您只是键入了它,否则这可能不是您真正的问题。)您的编译错误是什么?可能lambda表达式需要返回类型:[](int number)->bool。。。。据我所知,在MSVC的某些版本中,返回类型需要明确定义。谢谢。这是一个输入错误。@user1899020正如已经询问过的那样,请提供编译器错误。如果我们甚至不知道编译器为什么不高兴,我们就不能很容易地帮助您找到解决方法;自动f=大于(10)(i)@user1899020应该这样做,因为它不需要虚拟地调用lambda。此外,当lambda在模板中使用时,编译器可以看到lambda的所有内容,因此它可以将lambda直接内联到模板函数的实例化中。@user1899020应该这样做,因为它不需要虚拟调用lambda。此外,当lambda在模板中使用时,编译器可以看到lambda的所有内容,因此它可以将lambda直接内联到模板函数的实例化中。