C++ - "Curiously Recurring Template Pattern"
Verfasst: Mo Mär 26, 2012 10:24 am
Tag.
Also hier gehts um das sogenannte Curiously Recurring Template Pattern (CRTP), bei dem eine Basisklasse ein Template ist, das vom Typ der abgeleiteten Klasse ist, also auf folgende Weise:
So weit, so gut. An mehreren Stellen wird darauf verwiesen, dass man damit Virtuelle Funktionen simulieren kann. Der Code auf Wikipedia sieht so aus:
Bei genauerer Überlegung frage ich mich aber eigentlich: was genau wird hier simuliert?? Was ist da noch Virtuell? Wenn einen Basiszeiger haben will, muss der Abgeleitete Typ immer mitgegeben werden:
ok, ich kann mit dem "Basiszeiger" zwar die Abgeleiteten Funktionen aufrufen - aber überall wo ich diesen Zeiger verwende muss ich die Abgeleitete Klasse als Templateargument übergeben. Da könnte ich ja gleich statt dem Basiszeiger die abgeleitete Version verwenden, oder seh ich das falsch? Polymorphismus ist das nicht (auch kein "simulierter").
Sieht jemand einen Vorteil? Oder bin ich hier einem Anti-Pattern aufgesessen?
Also hier gehts um das sogenannte Curiously Recurring Template Pattern (CRTP), bei dem eine Basisklasse ein Template ist, das vom Typ der abgeleiteten Klasse ist, also auf folgende Weise:
Code: Alles auswählen
template <typename Derived> struct Base {
// ...
};
struct Derived : public Base<Derived> {
// ...
};
Code: Alles auswählen
template <class Derived>
struct Base
{
void interface()
{
// ...
static_cast<Derived*>(this)->implementation();
// ...
}
static void static_func()
{
// ...
Derived::static_sub_func();
// ...
}
};
struct Derived : Base<Derived>
{
void implementation();
static void static_sub_func();
};
Code: Alles auswählen
Base<Derived>* b_ptr = new Derived();
Sieht jemand einen Vorteil? Oder bin ich hier einem Anti-Pattern aufgesessen?