C++:实现一个接收 lambda 作为输入的高阶函数
C++: implementing a higher-order function which receives a lambda as an input
我们来看看下面的函数:
auto F(vector <int> *p) {
return [p](int y) -> int{ return y + (*p)[0]; };
}
它做了一件非常简单的事情:它接收一个指向整数向量的指针和 returns 一个以另一个整数作为输入的 lambda 和 returns 将这个整数添加到我们有指针指向的向量的第一个元素。
如果我想实现一个可以接受这样的 lambda 作为输入的高阶函数,显然我不能在原型中使用 auto
。我试过这样修复它:
typedef int *A (int);
A F(vector <int> *p) {
return [p](int y) -> int{ return y + (*p)[0]; };
}
但是该实现也带来了冲突:lambda 类型无法转换为 A
。
如何实现?
您可以使用模板:
template <class Func>
void foo(Func func);
foo(F(p)); // ok; Func deduced to the lambda type
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);
}
我们来看看下面的函数:
auto F(vector <int> *p) {
return [p](int y) -> int{ return y + (*p)[0]; };
}
它做了一件非常简单的事情:它接收一个指向整数向量的指针和 returns 一个以另一个整数作为输入的 lambda 和 returns 将这个整数添加到我们有指针指向的向量的第一个元素。
如果我想实现一个可以接受这样的 lambda 作为输入的高阶函数,显然我不能在原型中使用 auto
。我试过这样修复它:
typedef int *A (int);
A F(vector <int> *p) {
return [p](int y) -> int{ return y + (*p)[0]; };
}
但是该实现也带来了冲突:lambda 类型无法转换为 A
。
如何实现?
您可以使用模板:
template <class Func>
void foo(Func func);
foo(F(p)); // ok; Func deduced to the lambda type
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); }