Wie legt man verschiedene Template-Typen in einen Vektor ein?

8

Ich möchte eine Nachricht mit unbekannter Länge oder Anzahl von Argumenten erstellen. Ich habe eine einfache Vorlage wie

genommen %Vor%

und mit etwas überladen

%Vor%

(gleich für String usw.) Ich versuche, alles in einen Vektor zu pushen. Ich habe es versucht

%Vor%

aber nichts davon scheint zu funktionieren. Gibt es eine Möglichkeit, dies zu tun? Vielen Dank im Voraus.

    
DaClown 30.03.2009, 08:26
quelle

3 Antworten

13

Option 1: Stellen Sie sicher, dass alle verschiedenen Arten von Argumenten von einer Basisklasse abgeleitet sind und Zeiger auf diese Klasse verwenden. Beachten Sie, dass diese Option in Bezug auf die Speicherverwaltung riskant ist. Vielleicht möchten Sie es sicherer machen, indem Sie boost :: shared_ptr anstelle von Zeigern verwenden. Andernfalls müssen Sie manuell bereinigen, wenn ein Element aus dem Vektor entfernt wird.

Option 2 (mein persönlicher Favorit): Verwenden Sie Boost.Variant Erstellen Sie einen typedef aller möglichen Argumenttypen, und verwenden Sie typedef als Argumenttyp in std :: vector

%Vor%     
Benoît 30.03.2009, 08:30
quelle
6

Der einfachste Weg, dies zu tun, wäre, eine Basis-Argument-Klasse zu haben, die nicht in der Vorlage enthalten ist, und dann müssen die spezifischen Datentypen daraus abgeleitet werden. (Sie könnten sogar die Vorlagenversion direkt von der Basisklasse ableiten und einfach diese beiden Klassen verwenden.) Dann speichern Sie sie als Zeiger in einem Vektor.

Dies erfordert einige Funktionen, um auf die Argumentwerte zuzugreifen und gegebenenfalls Konvertierungen durchzuführen.

    
Daemin 30.03.2009 08:31
quelle
4

Sie könnten verwenden boost :: variant ( Ссылка )
oder boost :: any ( Ссылка ) Typen

oder void * - hässlich und nicht typsicher oder implementieren Sie einen eigenen generischen Typ, der eine Schnittstelle und eine andere templated Implementierung hat und Zeiger auf dieser Schnittstelle speichert.

Aber ich bin nicht sicher, ob die Verwendung ähnlicher Typen ein gutes Design ist.

    
bayda 30.03.2009 08:28
quelle

Tags und Links