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 有一个捕获,这意味着它具有需要存储在某处的状态,这意味着它 必须 是一个可调用对象而不是一个简单的自由函数。

您的选择是:

  1. 在低阶类型上实现高阶函数作为模板:

    template <typename Func>
    int higherOrder(int x, Func&& f)
    {
      return f(x);
    }
    

  2. 将 lambda 包裹在具有众所周知类型的东西中,通常是

    int higherOrder(int x, std::function<int(int)> const &f)
    {
      return f(x);
    }