fix + memonizememoize

今更
http://www.kmonos.net/wlog/52.php#_0308050827
http://d.hatena.ne.jp/Nabetani/20050901#p2
らへんを読んで,以前ここら辺の話題で遊んだことがあったので
http://d.hatena.ne.jp/Cryolite/20041124#p1
そのときのやつをちこっとだけ変形.

#include <iostream>
#include <map>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/if.hpp>

template<class F>
class memoized_fixer;

template<class F>
memoized_fixer<F> memoized_fix(F f)
{
  return memoized_fixer<F>(f);
}

template<class F>
class memoized_fixer
{
public:
  explicit memoized_fixer(F f)
    : f_(f)
  {}

  template<class T>
  T operator()(T x)
  {
    return memo_.find(x) != memo_.end()
      ? memo_[x]
      : memo_[x] = f_(memoized_fix(f_), x)
      ;
  }

private:
  F f_;
  std::map<int, int> memo_;
};

int main()
{
  using namespace std;
  using namespace boost;
  using namespace boost::lambda;

  function<int (function<int (int)>, int)> fib_maker
    = ret<int>(
        if_then_else_return(
          _2 <= 2
        , cref(1)
        , bind(_1, _2 - 1) + bind(_1, _2 - 2)
        )
      )
    ;

  cout << memoized_fix(fib_maker)(10) << endl;
  
  return 0;
}