Entry

プログラミングメモ - テンプレートテンプレートパラメタについて少し

2010年04月06日

またもや,個人的なメモ。Policy パターンはテンプレートの使い方でも,中核的な位置を占めつつあるけれども,効果的な使い方を思いつくには,それなりに工夫が必要な感じ。

#include <iostream>
#include <typeinfo>

////////////////////////////////////////////////////////////
class BaseHandler {
public:
  BaseHandler() {};
  virtual ~BaseHandler() {};
public:
  virtual void print() = 0;
};

template<typename T>
class HandlerA : public BaseHandler {
public:
  HandlerA() {};
  virtual ~HandlerA() {};
public:
  virtual void print() {
    std::cout << typeid(T).name() << std::endl;
  }
};

template<typename T>
class HandlerB : public HandlerA<T> {
public:
  HandlerB() {};
  virtual ~HandlerB() {};
public:
  virtual void print() {
    std::cout << "HandlerB:" << typeid(T).name() << std::endl;
  }
};

////////////////////////////////////////////////////////////
template<typename T, template<typename> class U = HandlerA>
class SomeClass {
public:
  SomeClass() {};
  virtual ~SomeClass() {};
public:
  void print() {
    ph_.print();
  }
protected:
  U<T> ph_;
};

////////////////////////////////////////////////////////////
int
main(int argc, char* argv[]) {
  SomeClass<int> someClassA;
  someClassA.print(); // -> "int"

  SomeClass<double, HandlerB> someClassB;
  someClassB.print(); // -> "HandlerB:double"

  return 0;
}

Policy パターンを使うと,クラスに拡張的な機能を静的に埋め込むことができるわけだけれども,結局,それらの機能は作らなくちゃいけません。機能の数が増えると,管理が大変になる。なもんで,こゆのは継承と組み合わせて使うのがスマートだと思うんだけれども,どうもうまくいかない。

上のようなコードで応用したいのは,次のように画像データを管理したいからです。

// RGBQuad 型のピクセルデータを持つ画像オブジェクト
Image<RGBQuad> image;

// foo.jpg を 24 bit カラーで読み取る
JPEGReader<RGBQuad, TrueColorMode> reader;
reader.read("foo.jpg", &image);

// ... いろいろな処理

// bar.png にグレースケールで書き出す
PNGWriter<RGBQuad, GrayMode> writer;
writer.write("bar.jpg", image);

読み書きするファイルの種類や,画素(ピクセル)の持ち方を汎用的に作りたいというわけ。途中まで作ってみたんだけれども,読み書きできるファイルの種類やデータの持ち方を増やそうと思うと,面倒な手続きが増えてしまう。差分だけコーディングできるような仕組みにしたいんだけれども,まだアイデア自体があやふやでごにょごにょ。

もちっと練ってみる。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN