Wenn ich so eine Aufzählung habe
enum Errors
{ErrorA=0, ErrorB, ErrorC};
Dann möchte ich auf Konsole ausdrucken
Errors anError = ErrorA;
cout<<anError;/// 0 will be printed
aber was ich will ist der text "ErrorA", kann ich es ohne if / switch machen?
Und was ist Ihre Lösung dafür?
enum class
: stackoverflow.com/questions/11421432/…Antworten:
Karte verwenden:
Verwenden eines Arrays von Strukturen mit linearer Suche:
Schalter / Gehäuse verwenden:
quelle
#p
ist der Präprozessor, der p stringifiziert. Der AufrufPROCESS_VAL(ErrorA)
gibt also Folgendes aus :case(ErrorA): s = "ErrorA"; break;
.enum
Werte , die ich denke , ist ein NO-GO . 2) Wenn ich die Lösung richtig verstehe, funktioniert sie nur für eineenum
.Verwenden Sie ein Array oder einen Vektor von Zeichenfolgen mit übereinstimmenden Werten:
BEARBEITEN: Die obige Lösung ist anwendbar, wenn die Aufzählung zusammenhängend ist, dh bei 0 beginnt und keine Werte zugewiesen sind. Es wird perfekt mit der Aufzählung in der Frage funktionieren.
Um weiter zu beweisen, dass die Aufzählung nicht bei 0 beginnt, verwenden Sie:
quelle
Hier ist ein Beispiel, das auf Boost.Preprocessor basiert:
quelle
DEFINE_ENUM
gibt mir den Fehler,multiple definition of `format_ProgramStatus(ProgramStatus)'
wenn ich versuche, es zu verwenden.Sie können einen einfacheren Pre-Prozessor-Trick verwenden, wenn Sie bereit sind, Ihre
enum
Einträge in einer externen Datei aufzulisten.In einer Quelldatei behandeln Sie die Datei dann wie eine Include-Datei, definieren jedoch, was Sie
ERROR_DEF
tun möchten .Wenn Sie ein Quell-Browsing-Tool (wie cscope) verwenden, müssen Sie es über die externe Datei informieren.
quelle
Hier gab es eine Diskussion, die helfen könnte: Gibt es eine einfache Möglichkeit, die C ++ - Aufzählung in einen String umzuwandeln?
UPDATE: Hier ist ein Skript für Lua, das einen Operator << für jede benannte Aufzählung erstellt, auf die es trifft. Dies erfordert möglicherweise einige Arbeit, damit es für die weniger einfachen Fälle funktioniert [1]:
Angesichts dieser Eingabe:
Es produziert:
Das ist wahrscheinlich ein Anfang für Sie.
[1] Aufzählungen in verschiedenen oder Nicht-Namespace-Bereichen, Aufzählungen mit Initialisiererausdrücken, die ein Komma enthalten usw.
quelle
Ich verwende ein String-Array, wenn ich eine Aufzählung definiere:
Profile.h
Profile.cpp
quelle
quelle
Das ist ein guter Weg,
Drucken Sie es mit einem Array von Zeichenarrays
So was
quelle
Sie könnten einen stl-Kartencontainer verwenden ....
quelle
switch(n) { case XXX: return "XXX"; ... }
? Welches hat O (1) Lookup und muss nicht initialisiert werden? Oder ändern sich die Aufzählungen zur Laufzeit?Für dieses Problem mache ich eine Hilfefunktion wie folgt:
Die lineare Suche ist normalerweise effizienter als
std::map
bei kleinen Sammlungen wie dieser.quelle
Für diese Lösung müssen Sie keine Datenstrukturen verwenden oder eine andere Datei erstellen.
Grundsätzlich definieren Sie alle Ihre Aufzählungswerte in einem #define und verwenden sie dann im Operator <<. Sehr ähnlich zu @ jxhs Antwort.
Ideone-Link für die endgültige Iteration: http://ideone.com/hQTKQp
Vollständiger Code:
Ausgabe:
Das Schöne daran ist, dass Sie für jeden Fehler auch Ihre eigenen benutzerdefinierten Nachrichten angeben können, wenn Sie glauben, dass Sie diese benötigen:
Ausgabe:
Wenn Sie Ihre Fehlercodes / Beschreibungen sehr aussagekräftig gestalten möchten, möchten Sie sie möglicherweise nicht in Produktions-Builds. Es ist einfach, sie auszuschalten, damit nur der Wert gedruckt wird:
Ausgabe:
In diesem Fall wäre das Auffinden der Fehlernummer 525 eine PITA. Wir können die Zahlen in der Anfangsaufzählung wie folgt manuell angeben:
Ausgabe:
quelle
Wie wäre es damit?
etc ... Ich weiß, dass dies ein sehr ausgeklügeltes Beispiel ist, aber ich denke, dass es gegebenenfalls Anwendung findet und benötigt wird und sicherlich kürzer ist als das Schreiben eines Skripts dafür.
quelle
Verwenden Sie den Präprozessor:
Der Vorteil dieses Ansatzes ist, dass: - es immer noch einfach zu verstehen ist, - es verschiedene Besuche ermöglicht (nicht nur String)
Wenn Sie bereit sind, das erste zu löschen, erstellen Sie sich ein FOREACH () -Makro
#define ERROR_VALUES() (ErrorA, ErrorB, ErrorC)
und schreiben Sie Ihre Besucher in FOREACH (). Dann versuchen Sie eine Codeüberprüfung zu bestehen :).quelle
Bitte schauen Sie sich diesen Beitrag an:
Aufzählung zum String in modernem C ++ 11 / C ++ 14 / C ++ 17 und zukünftigem C ++ 20
drz
quelle