Let's start Scheme

2006-12-05

メタプログラミング?

boost::spiritでgrammarの継承を行いたいと思って、
こんな感じのを書いてみた。

// 基底クラス
template < typename DerivedT >
struct base_grammar
    : grammar < base_grammar >
{
  template < typename ScannerT >
  struct definition
  {
    definition(const DerivedT& self)
    {
      //なんか書く
    }
  };
};

// 派生クラス
struct sample_grammar
    : base_grammar< sample_grammar >
{
  typedef base_grammar< sample_grammar > base_t;
  template < typename ScannerT >
  struct definition
     : base_t::definition< ScannerT >
  {
    definition(const DerivedT& self)
      : base_t::definition< ScannerT >(self) // ※1 これを忘れてたorz
    {
      //なんか書く
    }
  };  

};

※1を忘れていてしばらく悩んだよ。
って、これ基底クラスにデフォルトコンストラクタが存在していないから、
コンパイルでエラーが起きるのは当たり前ジャン。。。orz

それはさておき、
1段階のネストはうまくいくんだけど、
このもう1クラス噛ませるとうまくいかない。
この辺りはテンプレートのメタプログラミングに関係してくるんだろうけど、
メタプログラミングには足を入れないようにしてきたから、
さっぱり分からん。
Lokiのソースコードをみて頑張ってみるか。
やっぱりTypeListがいるのかなぁ。

No comments:

Post a Comment