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

まずパラメータ継承を使わないテンプレートメソッド。
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>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください