C++實現的一個可以寫遞迴lambda的Y函數_C 語言

來源:互聯網
上載者:User

最近學習C++11的variadic template argument,終於可以擺脫用fpmacro模板來複製一大堆代碼的做法了,好開心。這個例子的main函數用lambda寫了一個斐波那契數列的遞迴計算函數。跟以往不同的是,在Y函數的協助下,這個lambda表達是可以成功看到自己,然後遞迴調用。當然這仍然需要用普通的C++遞迴來實現,並不是λ-calculus那個高大上的Y Combinator。

#include <functional>#include <memory>#include <iostream>#include <string>using namespace std;template<typename TResult, typename ...TArgs>class YBuilder{private:  function<TResult(function<TResult(TArgs...)>, TArgs...)> partialLambda;public:  YBuilder(function<TResult(function<TResult(TArgs...)>, TArgs...)> _partialLambda)    :partialLambda(_partialLambda)  {  }  TResult operator()(TArgs ...args)const  {    return partialLambda(      [this](TArgs ...args)      {        return this->operator()(args...);      }, args...);  }};template<typename TMethod>struct PartialLambdaTypeRetriver{  typedef void FunctionType;  typedef void LambdaType;  typedef void YBuilderType;};template<typename TClass, typename TResult, typename ...TArgs>struct PartialLambdaTypeRetriver<TResult(__thiscall TClass::*)(function<TResult(TArgs...)>, TArgs...)>{  typedef TResult FunctionType(TArgs...);  typedef TResult LambdaType(function<TResult(TArgs...)>, TArgs...);  typedef YBuilder<TResult, TArgs...> YBuilderType;};template<typename TClass, typename TResult, typename ...TArgs>struct PartialLambdaTypeRetriver<TResult(__thiscall TClass::*)(function<TResult(TArgs...)>, TArgs...)const>{  typedef TResult FunctionType(TArgs...);  typedef TResult LambdaType(function<TResult(TArgs...)>, TArgs...);  typedef YBuilder<TResult, TArgs...> YBuilderType;}; template<typename TLambda>function<typename PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::FunctionType> Y(TLambda partialLambda){  return typename PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::YBuilderType(partialLambda);} int _tmain(int argc, _TCHAR* argv[]){  auto fib = Y([](function<int(int)> self, int index)  {    return index<2      ?1      :self(index-1)+self(index-2);  });   for (int i = 0; i < 10; i++)  {    cout << fib(i) << " ";  }  cout << endl;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.