Kombination von statischem und dynamischem Polymorphismus
-
Hallo,
ich habe ein Klassentemplate (Klasse A) mit Spezialisierungen von Memberfunktionen für verschiedene Datentypen.
Diese Spezialisierungen führen alle den selben Code für die unterschiedlichen Datentypen aus. Das klappt soweit - allerdings soll das ganze jetzt erweitert werden:Das Motto lautet ja: Kapseln, was variiert.
Es variiert der Code in den spezialisierten Funktionen.Leider können Memberfunktionen von Klassentemplates nicht partiell spezialisiert werden - deshalb denke ich an eine Interface-Klasse, von der die einzelnen nun gewünschten Berechnungsvarianten abgeleitet sind.
Geht das, oder gibt es andere Möglichkeiten?
-
Policy-Klassen:
template <typename T, typename MyPolicy> class A : public MyPolicy { ... void myFunc() { myPolicyFunc(); } };Und wenn MyPolicy von T abhängt, template template Parameter verwenden.
PS: IdR werden Fragen mit kleinen Beispielen schneller, häufiger und klarer beantwortet

-
deha schrieb:
PS: IdR werden Fragen mit kleinen Beispielen schneller, häufiger und klarer beantwortet

Da hast Du recht :), deshalb hier mein Beispiel:
Das ist die Template-Klasse:
template<typename T> class Builder_NR : public Builder_HG { public: ... void Build_HG(); T vtPv; };Und hier die Deklarationen der spezialisierten Funktion:
template <> void Builder_NR<FF>::Build_HG(); template <> void Builder_NR<FB>::Build_HG(); template <> void Builder_NR<BF>::Build_HG(); template <> void Builder_NR<BB>::Build_HG();Für den Typ FF sieht die Funktion so aus:
template <> void Builder_NR<FF>::Build_HG() { calc_vtPv(); // build hesse-matrix (pN) and gradient (rhs) for ( unsigned int i = 0; i < u; i++ ) { (*prhs_)(i,0) = -vtPv.d(i).x(); for ( unsigned int j = 0; j < u; j++ ) { (*pN_)(i,j) = vtPv.d(i).d(j); } } test_hesse(); }Die Funktion
calc_vtPv();ist Member von
Builder_NRund soll nun ebenfalls für verschiede Typen spezialisiert werden.
Policy-Klassen sind recht kompliziert finde ich - deshalb habe ich die Antwort oben nicht recht umsetzen können..
Euch einen guten Rutsch!
-
class FF_Policy { ... void Build_HG() { ... } FF vtPv; }; //more Policies template <class Policy> class Builder_NR : public Builder_HG, private Policy { ... //use Policy here, i.e. Build_HG(), vtPv };und calc_vtPv(): Entweder in die vorhandenen Policies oder einen weiteren Template-Parameter hinzufügen.