virtual und template



  • Hallo Leute!

    virtual und template vertragen sich ja leider nicht...

    kann man es aber dennoch irgendwie simulieren?

    ich habe ein Interface, welches uA eine methode dumpVars() zur verfuegung stellt.
    Diese Funktion soll bestimmte Variablen ausgeben.

    Nun haette ich fuer diese Funktion gerne eine moeglichkeit zu steuern wie diese variablen ausgegeben werden.

    also zB:

    Obj.dumpVars(PresentHTML());
    oder
    Obj.dumpVars(PresentCVS());

    nur moechte ich, dass der User selber solche 'functors' schreiben kann.
    ohne virtual ja kein problem:

    template<class Presentation>
    void dumpVars(Presentation presentation);
    

    doch wie bekomme ich einen aehnlichen effekt hin, wenn dumpVars virtual ist?

    Ein Interface 'Presentation' zu erstellen klappt ja auch nicht, da ich sonst Presentation an dumpVars by reference uebergeben muesste und man nicht mehr
    Obj.dumpVars(Foo());
    schreiben koennte...

    jemand eine Idee?



  • genau das gleiche Problem hatte ich neulich auch.

    Eine Lösung ist ein dispatcher zu benutzen, das Problem ist nur, dass du den für jede Klasse anpassen musst und der Code recht müselig wird

    struct base {
      template<typename T> void do(const T &bar);
    };
    
    struct derived1 : public base {
      template<typename T> void do_impl(const T &bar);
    };
    
    template<typename T> void base::do(const T &bar) {
      const derived1 *d1=dynamic_cast<const derived1*>(&bar);
      if(d1)
        d1->do_impl(bar);
      //...
    }
    

    im Endeffekt habe ich dann aber die langsammerer Methode über Funktoren, die von einer Basis Klasse abgeleitet sind gemacht, weil mir die Wartung/Erweiterung des Codes sonst zu schwer geworden wär



  • jo, mit ner abstrakten functor basisklasse werde ich es wohl machen müssen.

    es sei denn irgendeinem profir fällt da noch irgendwas ein...



  • Shade Of Mine schrieb:

    Ein Interface 'Presentation' zu erstellen klappt ja auch nicht, da ich sonst Presentation an dumpVars by reference uebergeben muesste und man nicht mehr
    Obj.dumpVars(Foo());
    schreiben koennte...

    Wieso nicht ? Es wird eine temporäres Objekt angelegt, das nach abarbeiten der Zeile wieder gelöscht wird.

    class A;
    
    class PresentationItf
    {
    public:
      void Dump(A & a) = 0;
    };
    
    class A
    {
    public:
      void DumpIt(PresentationItf & pi)
      {
        pi.Dump(*this);
      }
    };
    
    class PresentationHtml : public PresentationItf
    {
    public:
      void Dump(A & a);
    };
    
    void PresentationHtml::Dump(......
    
    int main()
    {
      A test;
    
      test.DumpIt(PresentationHtml());
    }
    

    sollte funktionieren. Const-Correctnes usw. dabei noch nicht beachtet. Diese Vorgehensweise lagert die eigentliche Ausgabe in eine extra Klasse aus. Das hat den Vorteil, weniger Abhängigkeiten zu schaffen. Außerdem muß man nicht an die Klasse A selber heran, wenn eine weitere Ausgabemöglichkeit geschaffen werden soll.


Anmelden zum Antworten