[英]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.
您的選擇是:
在低階類型上實現高階 function 作為模板:
template <typename Func> int higherOrder(int x, Func&& f) { return f(x); }
或者
將 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.