今更
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; }