C ++ 11中的遞歸lambda函數(shù)我是C ++ 11的新手。我正在編寫以下遞歸lambda函數(shù),但它不編譯。sum.cpp#include <iostream>#include <functional>auto term = [](int a)->int {
return a*a;};auto next = [](int a)->int {
return ++a;};auto sum = [term,next,&sum](int a, int b)mutable ->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);};int main(){
std::cout<<sum(1,10)<<std::endl;
return 0;}編譯錯誤:vimal @ linux-718q:?/ Study / 09C ++ / c ++ 0x / lambda> g ++ -std = c ++ 0x sum.cppsum.cpp:在lambda函數(shù)中:sum.cpp:18:36:錯誤:' ((<lambda(int, int)>*)this)-><lambda(int, int)>::sum'不能用作函數(shù)gcc版本gcc版本4.5.0 20091231(實驗性)(GCC)但如果我改變sum()下面的聲明,它的作用是:std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int {
if(a>b)
return 0;
else
return term(a) + sum(next(a),b);};有人可以點亮這個嗎?
3 回答

慕尼黑8549860
TA貢獻1818條經(jīng)驗 獲得超11個贊
使用C ++ 14,現(xiàn)在很容易制作一個有效的遞歸lambda,而不必std::function
在幾行代碼中產(chǎn)生額外的開銷(從原始代碼中進行少量編輯以防止用戶意外復制):
template <class F>struct y_combinator { F f; // the lambda will be stored here // a forwarding operator(): template <class... Args> decltype(auto) operator()(Args&&... args) const { // we pass ourselves to f, then the arguments. // [edit: Barry] pass in std::ref(*this) instead of *this return f(std::ref(*this), std::forward<Args>(args)...); }};// helper function that deduces the type of the lambda:template <class F>y_combinator<std::decay_t<F>> make_y_combinator(F&& f) { return {std::forward<F>(f)};}
您的原始sum
嘗試成為:
auto sum = make_y_combinator([term,next](auto sum, int a, int b) { if (a>b) { return 0; } else { return term(a) + sum(next(a),b); }});
- 3 回答
- 0 關注
- 509 瀏覽
添加回答
舉報
0/150
提交
取消