昨日の続きで、不動点と再帰関数生成関数。
三件ものトラックバックを受け、ちょっと喜んでいるんだが、
id:SaitoAtsushi:20050902:p1
で、
boostを使っているのでちょっと反則っぽい
と書かれてしまった。
仕方ないので、boost::function も boost::bind も使わないバージョンを作った。
boost::shared_ptr は使っているので、boost を使っていることにはなるが、shared_ptr ぐらい許してよ、ということで:
#include <iostream> #include <boost/shared_ptr.hpp> using namespace std; using namespace boost; template<typename ret, typename arg> struct tf{ typedef shared_ptr<tf> p; virtual ret operator()( arg x ) = 0;}; typedef tf<int,int> func; typedef tf<func::p, func::p> maker; struct fib_maker : public maker{ virtual func::p operator()( func::p f ){ return func::p( new fib( f ) ); } struct fib : public func{ func::p m_f; fib( func::p f ) : m_f( f ){} virtual int operator()( int x ){ return x <= 1 ? 1 : (*m_f)( x - 1 ) + (*m_f)( x - 2 ); } };}; struct fixer : public func{ maker::p m_g; fixer( maker::p g ) : m_g( g ){} int operator()( int i ){ func::p x( new fix( this ) ); return (*(*m_g)( x ))(i);} struct fix : public func{ fixer * m_fixer; fix( fixer * f ) : m_fixer( f ){} int operator()( int i ){ return (*m_fixer)( i );}};}; void test(){ maker::p maker( new fib_maker ); func::p fib( new fixer( maker ) ); for( int i = 0 ; i < 10 ; ++i ){ cout << (*fib)( i ) << ", ";}}
出来心で、変な整形ルールにしてみた。
字下げは三文字。昔、掲載されているソースの字下げが三文字の参考書があったよな、と思いつつ。
ちなみに。何もかも struct なのは、public: と書くのが面倒だったから。
この整形ルールにすると、クラス定義の後のセミコロンがじゃまくさい。
昨日書いたものとちがい、コピーしてもちゃんと動く。
その代わり、たぶん動作速度がずっと遅い。計ってないけど。
なんとなく、汚いコードだと思う。
boost::bind, boost::function 禁止ならこんなもんかなとも思う。