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