templated oder polymorpher Algorithmus



  • Hallo Forum,

    ich möchte einen relativ zeitintensiven Algorithmus implementieren, dessen Schnittstelle ungefähr so aussehen soll:

    class MyAlgo
    {
    public:
        MyAlgo(std::vector<MyType> data) : m_data(std::move(data)){}
    
        void Run() { /* modify elements of m_data */ }
    
        std::vector<MyType> Result() const { return m_data; }
    
    private:
        std::vector<MyType> m_data;
    };
    

    Jetzt würde ich gerne erreichen, dass der Algorithmus mit sämtlichen Ableitungen einer Basisklasse umgehen kann.

    std::vector<MyBase> baseVec;
    std::vector<MyDerived> derivedVec;
    
    MyAlgo algo1(baseVec);
    algo1.Run();
    
    MyAlgo algo2(derivedVec);
    algo2.Run();
    

    Ich frage mich nun, wie man das am sinnvollsten bewerkstelligt.

    Wenn ich schon eine Klassenhierarchie habe, scheint es irgendwie naheliegend, das über Polymorphismus zu lösen. Allerdings kommt mir das furchtbar umständlich vor, weil ich eben einen std::vector<MyBase*> verwenden müsste?

    Mir scheint ein templated Algorithmus einfacher und sinnvoller, aber aufgrund der Klassenhierarchie widerstrebt mir das ein wenig.

    Für ein paar Ratschläge wäre ich dankbar.



  • polyalgo schrieb:

    Mir scheint ein templated Algorithmus einfacher und sinnvoller, aber aufgrund der Klassenhierarchie widerstrebt mir das ein wenig.

    Warum?

    Wenn der Algorithmus für alle benötigten Klassen funktioniert, wäre doch jede andere (vermutlich aufwändigere) Lösung dumm.



  • Die entscheidende Frage ist, soll dein Algorithmus mit verschiedenen von MyBase abgeleiteten Objekten umgehen können (also können innerhalb des Vectors verschiedene Typen drin sein)? Wenn ja, dann bleibt dir wohl nur der polymorphe Ansatz.
    Der Template-Ansatz wäre dann zu empfehlen, wenn die übergebenen Daten bei jedem Algorithmus-Lauf komplett unterschiedlich sein können (wie in deinem Beispiel).

    Und natürlich könnest du auch beides kombinieren.



  • Vielen Dank für die schnellen Antworten!

    Einen vector mit gemischten Typen wird es nicht geben und mir ist inzwischen klar geworden wie simpel eigentlich eine templated-Lösung in meinem Fall ist. Es wir also darauf hinauslaufen.


Anmelden zum Antworten