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_NR
    

    und 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.


Anmelden zum Antworten