Laufzeit bestimmen, geben Sie für C++
Frage ich mich, ob der Typ kann bestimmt werden als Laufzeit-Informationen in C++.
(1) Obwohl meine Frage ist Recht allgemein, der Einfachheit halber, werde ich anfangen, von einem einfachen Beispiel:
#include <stdio.h>
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char * argv[])
{
if (strcmp(argv[1], "int")==0)
{
int t = 2;
}else if (strcmp(argv[1], "float")==0)
{
float t = 2.2;
}
cout << t << endl; //error: ‘t’ was not declared in this scope
return 0;
}
Für dieses Beispiel gibt es zwei Fragen:
(a) "argv[1] auf t" ist falsch, kann aber die Art info, die in der C-string argv[1] umgewandelt werden, um den eigentlichen Typ-Schlüsselwort? So brauchen wir nicht zu prüfen, für jede Art von if-else-Klausel und strcmp.
(b) zu machen, wie die variable t definiert im lokalen scope der if-Klausel immer noch gültig außerhalb. ich.e wie "export" eine lokale variable, die außerhalb des Anwendungsbereichs?
(2) Allgemein gesprochen, nicht speziell auf das einfache Beispiel oben, was sind die üblichen Methoden zur Laufzeit bestimmen-Typen? Es scheint mir, dass es vielleicht einige Möglichkeiten:
(a) kann man die Verarbeitung der Variablen wird festgelegt, wie der Typ in dem selben Umfang der definition. z.B.
#include <stdio.h>
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char * argv[])
{
if (strcmp(argv[1], "int")==0)
{
int t = 2;
cout << t << endl;
}else if (strcmp(argv[1], "float")==0)
{
float t = 2.2;
cout << t << endl;
}
return 0;
}
Und möglicherweise mithilfe von template-Funktion, um den gemeinsamen code für verschiedene Typen wiederverwendbar.
(b) oder man kann die abstrakte Klasse Typ und Polymorphismus, um indirekt den export der definition, aber ich bin nicht sicher, wie genau.
Vielen Dank für Ihre Beratung!
Du musst angemeldet sein, um einen Kommentar abzugeben.
1a: Nein, die Typen sind keine Objekte oder Werte in C++ (wie Sie z.B. in Python). Sie können jedoch, verwenden Sie verschiedene Werte ausgewählt, die durch den Wert von argv[1].
1b: Sorry, kann einfach nicht tun.
2: dynamic_cast und typeid (Betreiber) sind die einzigen Werkzeuge, die derzeit von der Sprache der Abfrage-Typ (nicht ungewöhnlich, die meisten Sprachen haben nur sehr wenige, aber engagierte, tools), und mit Ihnen allein um die Abfrage-Typ ist oft entmutigt, je nach situation (auch nicht ungewöhnlich, unter den anderen Sprachen).
2a: ja, und wie, dass ist die einfache, offensichtliche, und arbeitet hier—es gibt keinen Grund, etwas anderes, aber wie es Beispiel-code, nehmen wir an, Sie brauchen eine andere Lösung. Könnte man eine Funktion aufrufen template instanziiert auf der rechten Seite geben, da dies aber ziemlich viel die gleiche Sache wie der rest von 2a, geh ich nicht hinein.
2b: Beispiel für die Verwendung einer Unterklasse template, nur weil es praktisch:
Verwenden:
Diese ab, um die Zusammenführung der beiden Typen in einer Art, und Sie beide dieselbe Schnittstelle, Basis hier. Dies bedeutet jedoch nicht, eignet sich gut für jede Lösung, und eine Variante wie boost.Variante kann besser sein, vor allem, wenn die verschiedenen Typen, die erforderlich sind, in einem kleinen und bekannten im Voraus.
Benötigen Sie eine Klasse, die fähig ist zum speichern eines Werts verschiedener Arten. Kurz, eine union, Boost-Variante Klasse wäre die richtige Wahl.
Check-out Boost.Variante.