鍋あり谷あり

テーマを決めずに適当に書いています。

反則を避けて

昨日の続きで、不動点再帰関数生成関数。
三件ものトラックバックを受け、ちょっと喜んでいるんだが、
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 禁止ならこんなもんかなとも思う。