具体的には、仮想関数を持つ基本クラスの代わりにCRTPを使用して、仮想関数呼び出しオーバーヘッドなしでtemplate method patternを実装することができます。仮想関数を持つ
は、TMPは、次のようになります。
class ProvidesMethod {
protected:
void Method() {
// do something
Part1();
// do something else
Part2();
// do something final
}
private:
virtual void Part1() = 0;
virtual void Part2() = 0;
};
class ExposesMethod : private ProvidesMethod {
public:
using ProvidesMethod::Method;
private:
void Part1() {
// first part implementation
}
void Part2() {
// second part implementation
}
};
をCRTPで、それは次のようになります。
template <typename Derived>
class ProvidesMethod {
protected:
void Method() {
// do something
self().Part1();
// do something else
self().Part2();
// do something final
}
private:
Derived& self() { return *static_cast<Derived*>(this); }
const Derived& self() const { return *static_cast<const Derived*>(this); }
};
class ExposesMethod : private ProvidesMethod<ExposesMethod> {
public:
using ProvidesMethod<ExposesMethod>::Method;
private:
friend class ProvidesMethod<ExposesMethod>;
void Part1() {
// first part implementation
}
void Part2() {
// second part implementation
}
};
ひとつはできません。 2つは全く異なっており、さまざまな問題を解決します。しかし、一般的に、人々がYを使用すべきときにXを誤って使用した場合、「XではなくYを使用する」ことがアドバイスになります。それは、XとYが関連しているという意味ではなく、人々が何をしているのか分からないということだけです。 –
Whoa、[CRTP](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)パターンです。 – maverik