Auf gleichnamige Funktionen verschiedener std::vector-Inhalte zugreifen?



  • Hallo zusammen,

    gibt es in C++ ein Konstrukt, mit dem folgendes realisierbar ist?

    Ich habe verschiedene Datenklassen, beispielsweise

    class Data1 {              class Data2 {
      int getIndex1();           int getIndex1();
      int getIndex2();           int getIndex3();
      string getName();          int getIndex4();
    }                            string getName();
                               }
    

    Diese sollen in verschiedene Vektor-Klassen gespeichert werden:

    class Container1 {                  class Container2 {
      vector<Data1> data;                 vector<Data2> data;
      void sortByIndex1();                void sortByIndex1();
      void sortByIndex2();                void sortByIndex3();
      void sortByname();                  void sortByIndex4();
                                          void sortByName();
      Data1 getByIndex1(int i);           Data2 getByIndex1(int i);
      Data1 getByIndex2(int i);           Data2 getByIndex3(int i);
      Data1 getByName(string n);          Data2 getByIndex4(int i);
    }                                     Data2 getByName(string n);
                                        }
    

    Nun sehen alle sort- und getBy-Funktionen inhaltlich ungefähr gleich aus. Da doppelter Code zu vermeiden ist, wünsche ich mir ungefähr sowas:

    template <typename T> : std::vector<T>
    class SortableVector
    {
      void sortBy( getFunction );
      T getBy( getFunction, ReturnTypeOfGetFunction index );
    }
    

    T kann DataN sein mit N = 1, 2, 3, ...
    getFunction kann getIndexN() und idealerweise auch getName() von DataN sein.
    ReturnTypeOfGetFunction ist int für getIndexN() und string für getName().
    index ist i für getFunction == getIndexN() oder n für getFunction == getName().

    Ich hoffe, Ihr versteht was ich meine 🙄

    Gibt es dafür eine Lösung? 😕

    Viele Grüße
    Michael



  • Wenn ich Dich richtig verstanden habe: genau dafür wurden Templates "erfunden".

    Ergänung: realisiere Deine Container schon als Templates

    mfg Martin



  • Daß ich hierfür ein Template brauche, ist mir schon klar und dafür gibt es auch diverse Tutorials, die man ergooglen kann.

    Womit ich nicht klarkomme und wozu ich auch nichts finde (vielleicht weil ich nicht weiß, wonach ich suchen muß) ist, das die Funktionen SortableVector::getBy() und SortableVector::sortBy() als Parameter wieder eine Art Funktionspointer haben müssen. Auch zu Funktionspointern gibt es viel im Internet, aber noch nichts konnte mir beantworten, ob die dafür überhaupt das richtige Mittel sind und falls ja, was ich dann als Parameter übergebe. Es ist ja kein konkreter Verweis auf eine Funktion eines einzelnen Elements, sondern eher ein Verweis auf einen Funktionsnamen, der für alle Elemente je einmal aufgerufen werden muß, um zum gewünschten Ergebnis zu kommen.

    Viele Grüße
    Michael



  • Nimm folgendes:

    std::sort(vec.begin(), vec.end(), [](const Data &a, const Data &b) {return a.getIndex1() < b.getIndex1();});
    

    Selbe mit std::find_if.


Anmelden zum Antworten