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