簡體   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