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:

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

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

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

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

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

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

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

    ReplyDelete
  6. はっはっは
    それに今気づいた 笑

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.