#include <iostream>
struct a {
enum LOCAL_A { A1, A2 };
};
enum class b { B1, B2 };
int foo(int input) { return input; }
int main(void) {
std::cout << foo(a::A1) << std::endl;
std::cout << foo(static_cast<int>(b::B2)) << std::endl;
}
Das a::LOCAL_A
ist es, was die stark typisierte Aufzählung zu erreichen versucht, aber es gibt einen kleinen Unterschied: Normale Aufzählungen können in Ganzzahlentypen konvertiert werden, während stark typisierte Aufzählungen dies nicht ohne Umwandlung tun können.
Gibt es also eine Möglichkeit, einen stark typisierten Aufzählungswert in einen ganzzahligen Typ ohne Umwandlung umzuwandeln? Wenn ja, wie?
quelle
Wie andere gesagt haben, kann es keine implizite Konvertierung geben, und das ist beabsichtigt.
Wenn Sie möchten, können Sie vermeiden, dass der zugrunde liegende Typ in der Besetzung angegeben werden muss.
quelle
Eine C ++ 14-Version der Antwort von R. Martinho Fernandes wäre:
Wie bei der vorherigen Antwort funktioniert dies mit jeder Art von Aufzählung und zugrunde liegendem Typ. Ich habe das
noexcept
Schlüsselwort hinzugefügt, da es niemals eine Ausnahme auslösen wird.Update
Dies erscheint auch in Effective Modern C ++ von Scott Meyers . Siehe Punkt 10 (er ist auf den letzten Seiten des Artikels in meiner Kopie des Buches aufgeführt).
quelle
quelle
Nein, es gibt keinen natürlichen Weg .
Tatsächlich besteht eine der Beweggründe für die starke Eingabe
enum class
in C ++ 11 darin, die stille Konvertierung in C ++ 11 zu verhindernint
.quelle
Der Grund für das Fehlen einer impliziten Konvertierung (beabsichtigt) wurde in anderen Antworten angegeben.
Ich persönlich verwende unary
operator+
für die Konvertierung von Aufzählungsklassen in den zugrunde liegenden Typ:Was ziemlich wenig "Tippaufwand" gibt:
Wo ich tatsächlich ein Makro verwende, um Enums und die Operatorfunktionen auf einmal zu erstellen.
quelle
Hoffe das hilft dir oder jemand anderem
quelle
un.i
das "aktive Mitglied" ist und Sie nur das aktive Mitglied einer Gewerkschaft lesen können.static_cast
.Eine kurze Antwort ist, dass Sie nicht wie oben beschrieben darauf hinweisen können. Aber für meinen Fall wollte ich den Namespace einfach nicht überladen, aber dennoch implizite Konvertierungen durchführen, also habe ich einfach Folgendes getan:
Die Art des Namespaces fügt eine Ebene der Typensicherheit hinzu, während ich dem zugrunde liegenden Typ keine Aufzählungswerte statisch umwandeln muss.
quelle
Foo::Foo
. Auf Mitglieder kann alsFoo::bar
und zugegriffen werden und sieFoo::baz
können implizit besetzt werden (und daher nicht viel Typensicherheit). Es ist wahrscheinlich besser, fast immer Enum-Klassen zu verwenden, insbesondere wenn Sie ein neues Projekt starten.Dies scheint mit dem Eingeborenen unmöglich
enum class
, aber wahrscheinlich können Sie einenum class
mit einem verspottenclass
:In diesem Fall,
wäre gleichbedeutend mit:
Dies entspricht größtenteils dem Original
enum class
. Sie könnenb::B1
in einer Funktion mit Rückgabetyp direkt für zurückgebenb
. Sie können damit machenswitch case
, etc.Im Sinne dieses Beispiels können Sie Vorlagen (möglicherweise zusammen mit anderen Dingen) verwenden, um jedes mögliche Objekt, das durch die
enum class
Syntax definiert wird, zu verallgemeinern und zu verspotten .quelle
Wie viele sagten, gibt es keine Möglichkeit, automatisch zu konvertieren, ohne Overhead und zu viel Komplexität hinzuzufügen, aber Sie können Ihre Eingabe ein wenig reduzieren und sie durch die Verwendung von Lambdas besser aussehen lassen, wenn einige Besetzungen in einem Szenario etwas häufig verwendet werden. Dies würde ein wenig Funktions-Overhead-Aufruf hinzufügen, aber den Code im Vergleich zu langen static_cast-Zeichenfolgen besser lesbar machen, wie unten zu sehen ist. Dies ist möglicherweise nicht projektweit nützlich, sondern nur klassenweit.
quelle
Das C ++ - Komitee machte einen Schritt vorwärts (Aufzählung von Aufzählungen aus dem globalen Namespace) und fünfzig Schritte zurück (kein Zerfall des Aufzählungstyps in eine Ganzzahl). Leider
enum class
ist es einfach nicht verwendbar, wenn Sie den Wert der Aufzählung auf nicht symbolische Weise benötigen.Die beste Lösung besteht darin, es überhaupt nicht zu verwenden und stattdessen die Aufzählung selbst mithilfe eines Namespace oder einer Struktur zu erfassen. Zu diesem Zweck sind sie austauschbar. Sie müssen ein wenig mehr eingeben, wenn Sie sich auf den Aufzählungstyp selbst beziehen, aber das wird wahrscheinlich nicht oft der Fall sein.
quelle