2007-03-09

Expression Template

C++ Templatesに載っているExpression Templateの実装は、嫌いだった。物凄く面倒なのだ。これを実装するぐらいだったら、自前でループを書いたほうが、まだましだろう。

ところで、C++ Template Metaprogrammingを読んでいると、より分かりやすい方法が見つかった。C++ Templatesに載っている方法は、各種演算のための参照でラップするクラスと、演算子をオーバーロードするテンプレート関数があったのだが、C++ Template Metaprogrammingのサンプルでは、この演算方法を、テンプレートパラメータとしていた。

struct plus
{
  static float apply(float a, float b)
  { return a + b ; }
} ;

struct minus
{
  static float apply(float a, float b)
  { return a - b ; }
} ;

template < typename L, typename OpTag, typename R >
struct Expression
{
  Expression(L const & l, R const & l)
    : l(l), r(r) { }
  float operator[](unsigned index) const
  { return OpTag::apply(l[index], r[index]) ; }

  L const & l ;
  R const & r ;

} ;

template < typename L, typename R >
Expression<L, plus, R> operator + (L const & l, R const & r)
{
  return Expression<L. plus, R>(l, r) ;
}

なんて分かりやすいんだろう。C++ Templatesの実装では、Expression_Addとか、Expression_Subなどをそれぞれ用意しなければならないが、こうすると、かなり分かりやすくなる。なぜ今まで思いつかなかったのだろう。分かってしまうと単純なのに、自力で発見することはできない。コロンブスの卵というやつだろうか。

6 comments:

MB said...

XpressiveにProtoという
サブコンポーネントがあります
これは意外と読みやすいのでお勧めです。

P.S.
ここはコメントつけるのにえらい苦労する
俺意外コメントしねえよここはクソだ

江添亮 said...

うーん、コメント機能以外は気に入っているんのですが。
別ウインドウが開くというのは、タブブラウザ主流の近年の傾向と逆行している気がします。

Xpressiveですか。CVSから引っ張ってこないといけませんね。1.34はいつリリースされるのだろう。

江添亮 said...

ポップアップウインドウではないようにしてみました。
でも、あまり使い勝手は良くならないようです。
Google傘下ともあろうブログサービスが、なぜこんな貧弱なサービスなんでしょうね。

MB said...

う、すいません
パスワード入れるのがめんどうで
酔ってついつい切れたようです
シラフの私はいい人です
本の虫さんは好きです
Cryoliteさんは嫌いです 笑

江添亮 said...

googleのアカウントがなくてもコメントできる設定にしているはずですが。
しかし、元の記事へのリンクが表示されないのはなんともお粗末。
やはりポップアップのほうがましでしょうか。

Anonymous said...

はっはっは
それに今気づいた 笑