Frage

Ich muss eine Reihe von Datenpunkten in Form von (Name, Wert) speichern, in der der Wert unterschiedliche Typen annehmen kann.

Ich versuche, eine Klassenvorlage für jeden Datenpunkt zu verwenden.Dann ist ich für jeden Datenpunkt, den ich sehe, ich möchte ein neues Objekt erstellen und ihn in einen Vektor zurückschieben.Für jeden neuen Typ muss ich zuerst eine neue Klasse aus der Vorlage erstellen.Aber ich kann die in einem beliebigen Vektor erstellten Objekte nicht speichern, da Vektoren den gleichen Typ für alle Einträge erwarten.Die Typen, die ich zu speichern muss, kann nicht in einer Erbschaftshierarchie montiert werden.Sie sind nicht zusammenhängend.Es können auch weitere Typen in der Zukunft erstellt werden, und ich möchte den Speicherdienst nicht für jeden neuen Typ ändern.Gibt es eine Möglichkeit, einen heterogenen Behälter zu erstellen, um diese Einträge zu speichern? Danke!

War es hilfreich?

Lösung

Die Boost-Bibliothek hat wahrscheinlich das, was Sie suchen (Boost :: beliebig).Sie können Ihre eigene mit einem umwickelten Zeigeransatz rollen, wenn Sie nicht mit dem Boost verwenden können ...

Andere Tipps

boost::any wurde bereits empfohlen, aber es ist für alles, so dass Sie nicht viel davon erwarten können.

Wenn Sie die verschiedenen Arten vor dem Zeitpunkt kennen, verwenden Sie besser mit dem generationspflichtigen Code.

generasacodicetagpre.

Das Problem mit Behältern wie diesem ist, dass Sie, wenn Sie auf etwas in den Behälter auf etwas zugreifen möchten, den Typ bestimmen und dann irgendwie an den tatsächlichen Typ werfen.Dies ist hässlich, ineffizient und fehleranfällig, weshalb die Wahl Nr. 1 in C ++ die Erbschaft nutzen soll, es sei denn, Sie haben einen sehr guten Grund, nicht auf - etwas, das ich nie in meiner C ++-Karriere gestoßen bin.

.

Ich dachte, Sie hätten nur ein Paar (Typ, ungültig *) und schreiben Sie einfach Ihre eigene Pop-Funktion, die die Lücke abgibt * abhängig von dem Typ, der in dem Paar beschreibt, und dann in einem beliebigen Container, der Ihr Auge fängt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top