繁体   English   中英

C++:实现高阶 function 接收 lambda 作为输入

[英]C++: implementing a higher-order function which receives a lambda as an input

下面我们来看看function:

auto F(vector <int> *p) {
  return [p](int y) -> int{ return y + (*p)[0]; };
}

它做了一件非常简单的事情:它接收一个整数向量处的指针,并返回一个 lambda,它有另一个 integer 作为输入,并返回将这个 Z157DB7DF530023575515D366C9B672 的第一个元素添加到向量的第一个元素的结果。 如果我想实现一个高阶 function 可以接受这样的 lambda 作为输入,我显然不能在原型中使用auto 我试着像这样修复它:

typedef int *A (int);

A F(vector <int> *p) {
      return [p](int y) -> int{ return y + (*p)[0]; };
    }

但是这种实现也带来了冲突: lambda 类型不能转换为A

这怎么可能实现?

我试着像这样修复它:

typedef int *A (int);

A F(vector <int> *p) {
      return [p](int y) -> int{ return y + (*p)[0]; };
}

... lambda 类型无法转换为A

原则上,这仅对完全无状态的 lambda 有意义。 Your lambda has a capture, which means it has state that needs to be stored somewhere, which means it must be a callable object rather than a simple free function.

您的选择是:

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

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

您可以使用模板:

template <class Func>
void foo(Func func);

foo(F(p));  // ok; Func deduced to the lambda type

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM