« C++のテンプレートはパラメータとして関数をとることができる | メイン | C++Builder2009におけるWin32APIのWideString版を呼び出す方法 »

パラメータ継承を使ったテンプレートメソッド

まずパラメータ継承を使わないテンプレートメソッド。
Wikipediaの例を参考にした。
StringListerで定義されている抽象メソッドformatItem()が、display()内で使われている。

class StringLister
{
public:
  virtual std::string formatItem(std::string item) = 0;
  void display(std::string item)
  {
    std::cout << formatItem(item) << std::endl;
  }
};
class PlainTextStringLister : public StringLister
{
public:
  virtual std::string formatItem(std::string item)
  {
    return "- " + item;
  }
};
class HtmlStringLister : public StringLister
{
public:
  virtual std::string formatItem(std::string item)
  {
    return "<li>" + item + "</li>";
  }
};

PlainTextStringLister().display("Foo"); //=> - Foo
HtmlStringLister().display("Foo");      //=> <li>Foo</li>

パラメータ継承を使ったテンプレートメソッド。
ConcreteClassのメソッドformatItem()が、display()内で使われている。

template<class ConcreteClass>
class StringLister : public ConcreteClass
{
public:
  void display(std::string item)
  {
    std::cout << ConcreteClass::formatItem(item) << std::endl;
  }
};
class PlainTextStringLister
{
protected:
  static std::string formatItem(std::string item)
  {
    return "- " + item;
  }
};
class HtmlStringLister
{
protected:
  static std::string formatItem(std::string item)
  {
    return "<li>" + item + "</li>";
  }
};

StringLister<PlainTextStringLister>().display("Foo"); //=> - Foo
StringLister<HtmlStringLister>().display("Foo");      //=> <li>Foo</li>

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/868

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年12月24日 17:35に投稿されたエントリーのページです。

ひとつ前の投稿は「C++のテンプレートはパラメータとして関数をとることができる」です。

次の投稿は「C++Builder2009におけるWin32APIのWideString版を呼び出す方法」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35