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

让我们看一下以下功能:

always @(*)

它做的很简单:它在整数向量处接收一个指针,并返回一个lambda,该lambda以另一个整数作为输入,并返回将该整数与向量的第一个元素相加的结果。 如果我想实现一个可以接受lambda作为输入的高阶函数,显然,我不能在原型中使用auto F(vector <int> *p) { return [p](int y) -> int{ return y + (*p)[0]; }; } 。我试图像这样修复它:

auto

但是这种实现也会带来冲突:lambda类型不能转换为typedef int *A (int); A F(vector <int> *p) { return [p](int y) -> int{ return y + (*p)[0]; }; }

如何实现?

zwm454 回答:C ++:实现一个接受lambda作为输入的高阶函数

  

我试图像这样修复它:

typedef int *A (int);

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

... lambda类型无法转换为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);
    }
    
,

您可以使用模板:

public List<HostelLocations> GetNearestHostels(double longitude,double latitude)
{
    //var coord = new GeoCoordinate(latitude,longitude);
    return database.Query<HostelLocations>("SELECT * FROM HostelLocations WHERE Longitude = ? AND Latitude = ?;",latitude,longitude);
}
本文链接:https://www.f2er.com/3078788.html

大家都在问