让我们看一下下面的函数:
auto F(vector <int> *p) {
return [p](int y) -> int{ return y + (*p)[0]; };
}
它做了一件非常简单的事情:它接收一个指向整数 vector 的指针并返回一个 lambda,它有另一个整数作为输入,并返回将这个整数添加到我们有一个指针的 vector 的第一个元素的结果.
如果我想实现一个可以接受这样的 lambda 作为输入的高阶函数,显然我不能在原型(prototype)中使用 auto
。我试过这样修复它:
typedef int *A (int);
A F(vector <int> *p) {
return [p](int y) -> int{ return y + (*p)[0]; };
}
但是该实现也带来了冲突:lambda 类型无法转换为 A
。
如何实现?
最佳答案
I tried fixing it like this:
typedef int *A (int);
A F(vector <int> *p) {
return [p](int y) -> int{ return y + (*p)[0]; };
}
... the lambda type cannot be converted to
A
.
原则上这仅对完全无状态的 lambda 有意义。您的 lambda 有一个捕获,这意味着它具有需要存储在某处的状态,这意味着它必须是一个可调用对象而不是一个简单的自由函数。
您的选择是:
将高阶函数作为低阶类型的模板实现:
template <typename Func> int higherOrder(int x, Func&& f) { return f(x); }
或
通常将 lambda 包裹在具有众所周知类型的东西中
int higherOrder(int x, std::function<int(int)> const &f) { return f(x); }
关于C++:实现一个接收 lambda 作为输入的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920483/