C++:实现一个接收 lambda 作为输入的高阶函数

标签 c++ lambda types return-type higher-order-functions

让我们看一下下面的函数:

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

您的选择是:

  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);
    }
    

关于C++:实现一个接收 lambda 作为输入的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920483/

相关文章:

c++ - 在函数中使用 vector 指针时出错

c++ - 如何混淆本地变量?

c++ - 函数不将数据存储到结构数组

java - lambda 表达式和实例化方法引用之间的不同行为

python - 返回 lambda 的函数的类型注释

c++ - C++ 中链表的重载运算符 +=

list - 如果你在 rackect 中将一个函数映射到一个列表上,你如何获得对下一个元素的引用?

sql - (Oracle/SQL) 将所有数据类型合并到单个列中

python - 解析 Pandas 列中的列表

types - 路径归纳隐含