Gibt es eine generische Art und Weise zu werfen , int
um enum
in C++
?
Wenn es int
in den Bereich von a fällt enum
, sollte es einen enum
Wert zurückgeben, andernfalls werfen Sie einen exception
. Gibt es eine Möglichkeit, es generisch zu schreiben ? Es enum type
sollte mehr als eine unterstützt werden.
Hintergrund: Ich habe einen externen Aufzählungstyp und keine Kontrolle über den Quellcode. Ich möchte diesen Wert in einer Datenbank speichern und abrufen.
enum e{x = 10000};
fällt in diesem Fall9999
in die Reichweite derenum
?9999
fällt nicht.enum class
.Antworten:
Das Offensichtliche ist, Ihre Aufzählung zu kommentieren:
Sie müssen das Array auf dem neuesten Stand halten
e
, was ein Ärgernis ist, wenn Sie nicht der Autor von sinde
. Wie Sjoerd sagt, kann es wahrscheinlich mit jedem anständigen Build-System automatisiert werden.In jedem Fall haben Sie es mit 7.2 / 6 zu tun:
Wenn Sie also nicht der Autor von sind
e
, haben Sie möglicherweise eine Garantie dafür, dass gültige Werte vone
tatsächlich in der Definition von angezeigt werden .quelle
Hässlich.
Nun zur eigentlichen Frage. Warum brauchst du das? Der Code ist hässlich, nicht einfach zu schreiben (*?) Und nicht einfach zu warten und nicht einfach in Ihren Code zu integrieren. Der Code sagt Ihnen, dass es falsch ist. Warum dagegen ankämpfen?
BEARBEITEN:
Alternativ, vorausgesetzt, Aufzählungen sind integrale Typen in C ++:
Aber das ist noch hässlicher als oben, viel anfälliger für Fehler, und es wird nicht so werfen, wie Sie es wünschen.
quelle
throw
für ungültige Typen finden (oder etwas Besonderes tun), einen Schalter haben, wie ich ihn gepostet habe.static_cast<MyEnum>
wird auch funktionieren und sollte demreinterpret_cast<MyEnum>
Wenn sich die Werte, wie Sie beschreiben, in einer Datenbank befinden, warum nicht einen Codegenerator schreiben, der diese Tabelle liest und eine .h- und .cpp-Datei mit der Aufzählung und einer
to_enum(int)
Funktion erstellt?Vorteile:
to_string(my_enum)
Funktion hinzuzufügen .quelle
to_enum(int)
basierende Funktion.make
das Datum zweier Dateien vergleichen, um festzustellen, ob der Generator erneut ausgeführt werden muss.Nein, in C ++ gibt es weder eine Selbstbeobachtung noch eine integrierte Funktion zur "Domänenprüfung".
quelle
Was denkst du über diesen?
Sie könnten dann Code verwende ich gepostet hier auf Werte zu wechseln.
quelle
Apples::insert(4)
irgendwo etwas hinzufügen , daher hat dies keinen Vorteil gegenüber einem Switch.Sie sollten nicht wollen, dass so etwas wie das, was Sie beschreiben, existiert. Ich befürchte, es gibt Probleme in Ihrem Code-Design.
Sie gehen auch davon aus, dass Aufzählungen in einem Bereich liegen, aber das ist nicht immer der Fall:
Dies liegt nicht in einem Bereich: Sollten Sie, selbst wenn dies möglich war, jede Ganzzahl von 0 bis 2 ^ n überprüfen, um festzustellen, ob sie mit dem Wert einer Aufzählung übereinstimmt?
quelle
Wenn Sie bereit sind, Ihre Aufzählungswerte als Vorlagenparameter aufzulisten, können Sie dies in C ++ 11 mit varadischen Vorlagen tun. Sie können dies als eine gute Sache betrachten, die es Ihnen ermöglicht, Teilmengen der gültigen Aufzählungswerte in verschiedenen Kontexten zu akzeptieren. oft nützlich beim Parsen von Codes aus externen Quellen.
Vielleicht nicht ganz so allgemein wie Sie möchten, aber der Prüfcode selbst ist verallgemeinert. Sie müssen nur den Wertesatz angeben. Dieser Ansatz behandelt Lücken, beliebige Werte usw.
quelle
C ++ 0x Alternative zur "hässlichen" Version, ermöglicht mehrere Aufzählungen. Verwendet Initialisierungslisten anstelle von Schaltern, ein bisschen sauberer IMO. Leider funktioniert dies nicht um die Notwendigkeit herum, die Enum-Werte fest zu codieren.
quelle