Template an Fkt. übergeben (ohne Typangabe)



  • Hi,
    der Titel ist vllt. etwas missverständlich, aber mir fiel nichts besseres ein.
    Es geht darum, dass ich eine Klasse habe, welche ein Datum kapselt, allerdings kann dieses verschiedene Typen haben. Habe dabei natürlich direkt an Templates gedacht.
    Jetzt habe ich aber das Problem, dass ich Objekte dieser Klasse (die auch jeweils versch. Typen haben sollen) an eine Funktion übergeben will und Objekte der Klasse zurückgeben will. Wenn ich aber als Parameter/Rückgabewert meine Templateklasse angebe, muss ich ja einen Typ festlegen. Gibt es eine Möglichkeit wie ich dies realisieren kann?
    Kleines Beispiel wie das ganze ungefähr aussieht:

    template<typename Type>
    class CData {
    public:
      CData(Type Value);
      Type GetData() const;
    protected:
      Type Data;
    };
    
    class Container {
    public:
      Container();
      void Append(???); //hier soll ein CData Objekt übergeben werden, zum speichern natürlich
      ??? GetData(int Index); //hier soll ein CData Objekt zurückgegeben werden
    protected:
      std::vector<???> Daten; // hier sollen mehrere Objekte von CData, jeweil mit verschiedenem Typ gespeichert werden
    };
    

    Wie kann ich die ??? Stellen ausfüllen, damit die Klasse macht was sie soll?
    Einen konkreten Typ von CData kann ich nicht angeben. Habe es mit einer Basisklasse versucht, von der ich CData ableite und wollte dann mit Polymorphie rangehen, aber dann muss ich z.B. bei der Rückgabe von GetData außerhalb der Klasse casten. Gefällt mir alles nicht so.

    Habt ihr eine Idee wie ich das realisieren kann?
    Danke!!!



  • Hi,

    es wird wahrscheinlich darauf hinauslaufen, dass Container auch ein Template
    wird.

    Gruß,
    CSpille



  • Hm meinst du soetwas:

    template<T>
    class Container {
    public:
      void Append(T Value);
      T GetData(int Index);
    protected:
      std::vector<T> Data;
    };
    

    Müsste ich mich dann nicht bei der Erstellung des Containers auf einen Typ festlegen, den dann alle CData Objekte haben? Das wäre dann auch nicht das was ich brauche.
    Im Endeffekt brauche ich sowas wie eine Liste, die verschiedene Typen aufnehmen kann. Und da ich sowas noch nicht in C++ gefunden habe und es auf meine Bedürfnisse zugeschnitten brauche (mein CData kapselt in meinem Projekt mehr als nur ein Datum), wollte ich es selbst programmieren. Hat im Endeffekt den Charakter von Listen in Python.



  • Entweder spezifizierst du den Parameter genau oder du mußt casten.
    Im Extremfall kannst du auch ein void* als Parameter nehmen.



  • CSpille schrieb:

    Im Extremfall kannst du auch ein void* als Parameter nehmen.

    Im Extremfall kann man einen varianten Typen oder boost::any im Container speichern, das ist unendlich viel sicherer als ein void-Zeiger. Zeigerfrickeleien müssen nun wirklich nicht sein 😉



  • Amateur schrieb:

    Müsste ich mich dann nicht bei der Erstellung des Containers auf einen Typ festlegen, den dann alle CData Objekte haben? Das wäre dann auch nicht das was ich brauche.

    C++ ist eine sehr typsichere Sprache und erlaubt keine Typauflösungen zur Laufzeit. Meistens (nicht immer) sind aber Listen für verschiedene Typen eh nicht gutes Design, da man umgekehrt erstmal wieder den Typ herausfinden muss (Thema void*, Variantentypen...)...

    cu André



  • Hi,
    An das Problem, den Typ hinterher wieder herauszufinden habe ich nicht gedacht.
    Werd mir deswegen wohl etwas anderes überlegen müssen.
    Trotzdem danke für die Antworten.


Anmelden zum Antworten