Deklarieren eines Datentyps dynamisch in C ++

7

Ich möchte Folgendes tun können:

Ich habe ein Array von Strings, die Datentypen enthalten:

%Vor%

Dann möchte ich später eine Variable eines der Datentypen zur Laufzeit erstellen. Ich werde zur Kompilierzeit nicht wissen, was der richtige Datentyp sein sollte.

Also zum Beispiel, wenn ich zur Laufzeit eine Variable x bestimmt habe, die vom Typ int sein muss:

%Vor%

Offensichtlich wird das nicht funktionieren, also wie könnte ich so etwas machen?

    
Blade3 14.05.2010, 12:39
quelle

12 Antworten

13

Die einfache Antwort ist, dass Sie nicht können - Typen müssen zur Kompilierzeit in C ++ bekannt sein. Du kannst etwas wie boost :: any oder unions machen, aber es wird nicht hübsch sein.

    
anon 14.05.2010, 12:41
quelle
12

Sie müssten Gewerkschaften verwenden, um so etwas zu erreichen, aber der Umgang mit Gewerkschaften ist eine sehr diffizile Angelegenheit. Sie sollten also eine Containerklasse wählen, die die Unionslogik hinter einer Schnittstelle wie Boost.Variant oder Qts QVariant

    
smerlin 14.05.2010 12:54
quelle
3

Sie können nicht. Diese Art der Laufzeitmetaprogrammierung wird in C ++ nicht unterstützt.

    
sepp2k 14.05.2010 12:41
quelle
2

Jeder, der sagt, dass Sie das in C ++ nicht tun können, hat eine offensichtliche Lösung vermisst. Hier können Sie eine Basisklasse verwenden, dort müssen Sie die häufig verwendete Schnittstelle definieren, und dann sind alle abgeleiteten Klassen alle Typen, die Sie benötigen. Setzen Sie es in einen intelligenten Zeiger, der für einen Behälter passend ist, und dort gehen Sie. Möglicherweise müssen Sie dynamische Inferenz verwenden, wenn Sie nicht genug der Schnittstelle in die Basisklasse, die immer verpönt ist, weil es hässlich ist, aber es ist aus einem bestimmten Grund. Und das dynamische Zuweisen von Typen ist wahrscheinlich nicht die effizienteste Sache, aber wie immer hängt es davon ab, wofür Sie es verwenden.

    
paul 14.05.2010 13:02
quelle
1

Das einzige, was Sie tun können, ist, die Typen manuell zu durchlaufen und jeden einzelnen zu vergleichen. Es gibt auch die Möglichkeit, ein Factory-Objekt zu verwenden - aber das würde den Heap betreffen.

    
Puppy 14.05.2010 12:53
quelle
1

Ich glaube, Sie suchen wirklich nach einer dynamisch typisierten Sprache. Betten Sie einen Interpreter ein, wenn Sie müssen bei C ++ bleiben!

Oder Sie können etwas implementieren, das dem Komponentenmodell ähnelt und Schnittstellen verwendet, um mit umgebrochenen Daten zu arbeiten. Beginne mit der kosmischen Basisklasse - IObject, implementiere dann Interfaces für IInteger, IDouble, IString, etc. Die Objekte selbst würden dann von einer Factory erzeugt werden.

Oder Sie könnten einfach void-Puffer mit einer Factory verwenden ... Das ist der uralte Weg, die statische Typisierung in C / C ++ zu vermeiden (ohne die Verwendung von vererbungsbasiertem Polymorphismus). Dann streue großzügig reininterpret_cast ein.

    
Jeremy Brown 14.05.2010 13:26
quelle
1

Sie sprechen über den Datentyp "Variant" von Visual Basic. Es kann alles enthalten, primäre Datentypen, Arrays, Objekte usw.

"Die Collection-Klasse in der OLE-Automatisierung kann Elemente mit unterschiedlichen Datentypen speichern. Da der Datentyp dieser Elemente zur Kompilierungszeit nicht bekannt sein kann, werden bei den Methoden zum Hinzufügen und Abrufen von Elementen aus einer Sammlung Varianten verwendet Wenn das Konstrukt "For Each" verwendet wird, muss die Iteratorvariable vom Objekttyp oder einer Variante sein. " - aus Ссылка

Die obige Seite gibt einige Einblicke in die Verwendung von Varianten und zeigt, wie OLE in C ++ für den Umgang mit Varianten verwendet wird.

    
Abhijeet Pathak 14.05.2010 13:42
quelle
1

Am nächsten kommt man mit Vorlagen:

%Vor%

Wenn Sie etwas viel Komplexeres brauchen, hat Boost eine C ++ - Python-Brücke.

    
MSalters 14.05.2010 13:58
quelle
1

In Ihrem einfachen Beispiel wäre es nicht von Vorteil, den breitesten Typ in der Liste nicht einfach als generischen Container zu verwenden und bei Bedarf auf die kleineren Typen umzustellen (oder sich sogar auf implizite Umwandlungen zu verlassen).

Du könntest mit Unionen, Klassen, Polymorphismus, RTTI, Boost-Varianten usw. sehr sorgfältig arbeiten, aber nur für eine Liste von verschiedenen Ganzzahlen ist es die Mühe kaum wert.

Es scheint mir, dass Sie ein Problem haben, für das Sie eine unpraktische Lösung erfunden haben, für die Sie jetzt um Hilfe bitten. Sie würden wahrscheinlich besser Ihr ursprüngliches Problem beschreiben, anstatt Ihre Lösung zum Problem zu machen!

    
Clifford 14.05.2010 13:59
quelle
1

Vergessen Sie auch nicht alle Funktionen, die mit diesem mysteriösen Datentyp arbeiten müssen. Die meisten Funktionen sind so konzipiert, dass nur ein Typ verwendet wird, z. Die Funktionen sind überladen, um zusätzliche Typen zu behandeln.

Woher wissen Sie zur Laufzeit, was der Variablentyp ist?

    
Thomas Matthews 14.05.2010 16:25
quelle
0

Der einzige Weg, der Ihnen jetzt einfällt, ist der alte C-Stil, bei dem der Zeiger auf void wie folgt verwendet wurde:

%Vor%

Leter an Sie können ein beliebiges Objekt wie folgt zuweisen:

%Vor%

Wenn Sie den Typ in der Laufzeit kennen, können Sie die angegebene Funktion für eine solche Variable wie folgt ausführen:

%Vor%

Auf diese Weise (casting void *) wird beispielsweise verwendet, wenn die malloc [, usw.] -Funktion verwendet wird.

Ich sage nicht, dass es eine gute Übung ist, wenn c ++ jetzt viel weiter entwickelt ist. Stimmen Sie immer noch mit Personen überein, die sagen, dass es nicht die beste Lösung für Ihr Problem ist. Aber vielleicht können Sie es nach einer Neugestaltung hilfreich finden.

Sie finden vielleicht auch einen interessanten automatischen Typ seit C ++ 11. Ссылка

    
nosbor 16.10.2015 08:03
quelle
0

Ich denke, diese Antwort würde ein paar Jahre zu spät sein. Aber für Leute, die diesen Thread möglicherweise sehen, wäre eine mögliche Lösung hierfür die Verwendung variabler Vorlagen. Zum Beispiel:

%Vor%

Das einzige Problem dabei ist, dass Sie den Variablentyp dessen, was sich derzeit in der Variablen befindet, kennen müssen (z. B. Speichern in einem Integer-Array für die Variable "id" (die ID, die Sie angeben würden) spezifischer Typ). Wenn Sie nicht wissen oder nicht wissen, was sich in einer bestimmten Variablen oder einem Array befindet, empfehle ich nicht, dies zu verwenden.

    
incognito50 06.12.2015 15:19
quelle

Tags und Links