Aufzählung in modernem C ++ 11 / C ++ 14 / C ++ 17 und zukünftigem C ++ 20
Im Gegensatz zu allen anderen ähnlichen Fragen, diese Frage ist über die Verwendung des neuen C++ - Funktionen.
- 2008 c gibt es eine einfache Möglichkeit zu konvertieren C++ enum zu string?
- 2008 c Einfache Möglichkeit zur Verwendung von Variablen enum-Typen als string in C?
- 2008 c++ Wie man sich leicht anzeigen c++ enums strings
- 2008 c++ etwas, das sowohl a C id und einem string?
- 2008 c++ gibt es ein einfaches Skript zur Konvertierung von C++ - enum zu string?
- 2009 c++ Wie zu verwenden Enumerationen, die als flags in C++?
- 2011 c++ so konvertieren Sie ein enum-Typ-variable in einen string?
- 2011 c++ Enum to String C++
- 2011 c++ so konvertieren Sie ein enum-Typ-variable in einen string?
- 2012 c Wie konvertieren von enum-Namen zu einem string in c
- 2013 c Stringifying eine bedingt kompiliert enum in C
Nach der Lektüre viele Antworten, habe ich noch nicht finden:
- Elegante Weise mit C++11C++14 oder C++17 neue features
- Oder etwas ready-to-use in Steigern
- Sonst noch etwas geplant für C++20
Beispiel
Ein Beispiel ist oft besser als eine lange Erklärung.
Kompilieren Sie und führen Sie dieses snippet auf Coliru.
(Ein weiteres ehemaliges Beispiel ist auch verfügbar)
#include <map>
#include <iostream>
struct MyClass
{
enum class MyEnum : char {
AAA = -8,
BBB = '8',
CCC = AAA + BBB
};
};
//Replace magic() by some faster compile-time generated code
//(you're allowed to replace the return type with std::string
//if that's easier for you)
const char* magic (MyClass::MyEnum e)
{
const std::map<MyClass::MyEnum,const char*> MyEnumStrings {
{ MyClass::MyEnum::AAA, "MyClass::MyEnum::AAA" },
{ MyClass::MyEnum::BBB, "MyClass::MyEnum::BBB" },
{ MyClass::MyEnum::CCC, "MyClass::MyEnum::CCC" }
};
auto it = MyEnumStrings.find(e);
return it == MyEnumStrings.end() ? "Out of range" : it->second;
}
int main()
{
std::cout << magic(MyClass::MyEnum::AAA) <<'\n';
std::cout << magic(MyClass::MyEnum::BBB) <<'\n';
std::cout << magic(MyClass::MyEnum::CCC) <<'\n';
}
Einschränkungen
- Bitte keine wertvolle Vervielfältigung von andere Antworten oder Standard Verbindung.
- Bitte vermeiden aufblasen makro-basiert Antwort, oder versuchen zu reduzieren, die
#define
Aufwand so minimal wie möglich. - Bitte keine manuellen
enum
->string
mapping.
Schön zu haben
- Unterstützen
enum
die Werte ab einer Zahl von null Verschieden - Unterstützung negative
enum
Werte - Unterstützung fragmentiert
enum
Werte - Unterstützen
class enum
(C++11) - Unterstützen
class enum : <type>
dass alle zulässigen<type>
(C++11) - Compile-Zeit (nicht Laufzeit) Umwandlungen in einen string
oder zumindest eine schnelle Ausführung zur Laufzeit (z.B.std::map
ist keine gute Idee...) constexpr
(C++11, entspannt in C++14)noexcept
(C++11)- snippet C++14/C++17 freundliche
- C++ Stand der Technik
Eine mögliche Idee könnte mit der C++ - compiler Funktionen zum generieren von C++ code bei der Kompilierung-Zeit mit meta-Programmierung tricks basieren auf variadic template class
und constexpr
Funktionen...
InformationsquelleAutor der Frage olibre | 2015-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ähnlich wie Yuri Finkelstein; jedoch nicht erforderlich, zu steigern. Ich bin mit einer Karte, die Sie zuweisen können, einen beliebigen Wert für die Enumerationen, um Sie.
Deklaration von enum-Klasse als:
Dem folgenden code wird automatisch erstellt die enum-Klasse und überlast:
Keine Verstärkung erforderlich, die alle erforderlichen Funktionen zur Verfügung.
Code:
Beispiel:
können Sie den code ausführen hier
InformationsquelleAutor der Antwort Danilo Ramos
(Der Ansatz der better_enums Bibliothek)
Gibt es einen Weg, um enum zu string in der aktuellen C++ sieht das so aus:
Verwendung:
Alle Operationen vorgenommen werden können
constexpr
. Sie können auch der Umsetzung der C++17 Reflexion Vorschlag erwähnt in der Antwort von @ecatmur.#
) ist der einzige Weg, um zu konvertieren ein Zeichen, um eine Zeichenfolge in der aktuellen C++.constexpr
. Es kann auch gemacht werden, um die Arbeit mit C++98 +__VA_ARGS__
. Es ist definitiv modern C++.Makro-definition ist etwas umständlich, so bin ich der Antwort auf diese in mehrfacher Hinsicht.
Es ist einfach zu erweitern, die eine Antwort auf die Funktionen der Bibliothek – nichts "wichtiges" ist weggelassen. Es ist allerdings Recht mühsam, und es gibt compiler-Portabilität betrifft.
Haftungsausschluss: ich bin der Autor sowohl der CodeProject-Artikel und die Bibliothek.
Können Sie versuchen, die code in diese Antwortdie Bibliothekund die Umsetzung der N4428 live-online-in der Wandbox. Die Bibliothek enthält auch ein überblick über die Verwendung von es als N4428die erklärt, Enumerationen, die Teil des Vorschlags.
Erklärung
Den code unten implementiert Konvertierungen zwischen enums und strings. Jedoch, es kann erweitert werden um andere Dinge wie iteration. Diese Antwort umschließt eine enum in einem
struct
. Sie können auch generieren eine Eigenschaftenstruct
neben einer enum-statt.Die Strategie zu generieren, so etwas wie dieses:
Probleme sind:
{Red = 1, Green, Blue}
als Initialisierung für die Werte-array. Dies gilt nicht C++, weilRed
ist nicht ein zuweisbarer Ausdruck. Dieses Problem ist durch die casting-jede Konstante eines TypsT
dass eine Zuordnung Betreiber, aber drop die Zuordnung:{(T)Red = 1, (T)Green, (T)Blue}
.{"Red = 1", "Green", "Blue"}
als Initialisierung für das names-array. Wir müssen schneiden Sie die" = 1"
. Ich bin mir nicht bewusst eine großartige Möglichkeit, um dies zu tun zur compile-Zeit, so werden wir verschieben diese zur Laufzeit. Als Ergebnis_to_string
nichtconstexpr
aber_from_string
nochconstexpr
denn wir können die Behandlung von whitespace-Zeichen ist-gleich-Zeichen als Abschlusszeichen beim Vergleich mit unbeschnittenen strings.__VA_ARGS__
. Das ist ziemlich standard. Diese Antwort enthält auch eine einfache version, die kann mit bis zu 8 Elementen.constexpr
(oder nurconst
) - arrays im namespace-Gültigkeitsbereich, oder regelmäßige arrays in nicht-constexpr
statische inline-Funktionen. Der code in dieser Antwort ist für C++11 und nimmt den ehemaligen Ansatz. Der CodeProject-Artikel ist für C++98 und nimmt den letzteren.Code
und
Dem oben genannten Programm druckt
Red
wie man es erwarten würde. Es ist eine gewisse Art der Sicherheit, denn Sie können nicht erstellen ein enum ohne es zu initialisieren und löschen der Fälle aus derswitch
resultieren in einer Warnung vom compiler (je nach compiler und flags). Beachten Sie auch, dass"Red"
umgewandelt wurde zu enum bei der Kompilierung.InformationsquelleAutor der Antwort antron
C++17C++ - 20, Sie werden daran interessiert sein in der Arbeit der Reflexion Study Group (SG7). Gibt es eine parallele Reihe von Publikationen zu Wortlaut (P0194) und Grundlagen, design und Entwicklung (P0385). (Links lösen, um die neuesten Papier in jeder Serie.)Als der P0194r2 (2016-10-15), die syntax wäre die vorgeschlagene
reflexpr
Stichwort:Beispiel (adaptiert von Matus Choclik ist reflexpr Zweig von clang):
Statische Reflexion es nicht geschafft, in C++17 (eher in die wohl endgültige Entwurf vorgestellt im November 2016 Normen-Tagung in Issaquah), aber es gibt ein Vertrauen, dass es in C++20; von Herb Sutter-Reise-Bericht:
InformationsquelleAutor der Antwort ecatmur
Zurück im Jahr 2011 verbrachte ich ein Wochenende fine-tuning ein makro-basierte Lösung und endete nie, es zu benutzen.
Meine aktuelle Vorgehensweise ist, Vim zu starten, kopieren Sie die Enumeratoren in einem leeren Schalter Körper, beginnen Sie ein neues makro auf, transformieren Sie die erste enumerator in einer case-Anweisung, bewegen Sie den cursor an den Anfang der nächsten Zeile makro stoppen und erzeugen Sie die restlichen case-Anweisungen durch ausführen des Makros auf der anderen aufgelistet.
Vim-Makros sind mehr Spaß als C++ - Makros.
Real-life-Beispiel:
Werde ich erstellen:
Und das ist, wie ich durch zu bekommen.
Native Unterstützung für enum stringification wäre viel besser, wenn. Ich bin sehr daran interessiert zu sehen, die Ergebnisse der Reflexion Arbeitsgruppen in C++17.
Einen alternativen Weg, es zu tun war, gepostet von @sehe in der Kommentare.
InformationsquelleAutor der Antwort StackedCrooked
Ich weiß nicht, wenn du gehst, es zu mögen oder nicht, ich bin nicht Recht glücklich mit dieser Lösung, aber es ist ein C++14 freundliche Ansatz, weil es mit template-Variablen und missbrauchen template-Spezialisierung:
Das Schlimmste über diesen Ansatz ist, dass ist ein Schmerz zu erhalten, aber es ist auch ein Schmerz zu halten einige andere ähnliche aproaches, nicht wahr?
Gute Punkte über diese Zufahrt:
Live-Beispiel
Bearbeiten
Geheimnissvolle user673679 du hast Recht; die C++ - 14-variable template-Ansatz ist es nicht, behandelt die Laufzeit Fall war es mein Fehler ist es zu vergessen 🙁
Aber wir können immer noch einige moderne C++ - Funktionen und-Variablen template-plus variadic template-Tricks zum erzielen einer runtime-übersetzung von enum-Wert zu string... es ist so lästig, wie die anderen, aber immer noch Wert zu erwähnen.
Beginnen wir mit einem template-alias zu verkürzen, die Zugang zu einer enum-string anzeigen:
Dann, das variadic template-Tricks:
"Best trick" ist hier die Verwendung von variable Vorlage für die Karte, die enthält die Werte und Namen der einzelnen enum-Eintrag; dieser Karte werden die gleichen in jeder übersetzungseinheit und haben den gleichen Namen überall so ist Recht unkompliziert und ordentlich, wenn wir die
initialize
Funktion wie diese:Sind wir asigning Namen zu jeder
MyEnum
Eintrag und verwendet werden können-Laufzeit:Kann aber verbessert werden mit SFINAE und überlastung
<<
Betreiber:Mit der richtigen
operator <<
nun können wir die enum-so:Dies ist auch lästig zu erhalten und verbessert werden kann, aber hoffe, Sie bekommen die Idee.
Live-Beispiel
InformationsquelleAutor der Antwort Paula_plus_plus
Ich hatte das gleiche problem vor ein paar Tagen. Ich konnte nicht finden, dass jeder C++ - Lösung, ohne einige seltsame makro-Magie, also entschied ich mich zu schreiben ein CMake-code-generator zu generieren, einfach switch-case-Anweisungen.
Verwendung:
Die Funktion durchsucht die include-Dateien im Dateisystem (verwendet die include-Verzeichnisse zur Verfügung, mit der include_directories Befehl), liest Sie und hat einige regex zu generieren, die Klasse und die Funktion(en).
HINWEIS: constexpr impliziert inline in C++, so dass mit dem USE_CONSTEXPR option erzeugt einen header nur Klasse!
Beispiel:
./includes/ein.h:
./CMakeLists.txt:
Generiert:
./enum2Str.hpp:
./enum2Str.cpp:
Update:
Das script unterstützt jetzt auch den Gültigkeitsbereich Enumerationen (enum class|struct) und
Ich zog es an ein separates repo mit ein paar anderen scripts, die ich oft verwenden: https://github.com/mensinda/cmakeBuildTools
InformationsquelleAutor der Antwort Mense
Wenn Ihr
enum
sieht aus wieKönnen Sie den Inhalt der
enum
in eine neue Datei:Und dann die Werte sein kann, umgeben von einem makro:
Nächste Schritt kann sein, die Gegenstände in der
enum
wieder:Und schließlich können Sie generieren utility-Funktionen über dieses
enum
:Die Lösung angewendet werden können, um älteren C++ - standards, und es nicht die Verwendung moderner C++ - Elemente, aber es kann verwendet werden, generiert viel code, ohne zu viel Aufwand und Pflege.
InformationsquelleAutor der Antwort eferion
Wie pro Antrag von der OP, hier eine abgespeckte version, die hässlichen makro-Lösung, basierend auf Boost Preprosessor und Variadic Makros.
Er ermöglicht eine einfache Liste wie die syntax der enumerator-Elemente zusammen mit dem setzen der Werte für die einzelnen Elemente, so dass
erweitert, um
Neben den erforderlichen Funktionen zur Ausgabe und einige Konvertierung zurück. Dieses makro wurde, um hier für Alter, und ich bin nicht ganz sicher, dass der effizienteste Weg, oder es wird eine konforme Art und Weise, aber es ist seitdem arbeiten
Den kompletten code in Aktion gesehen werden kann an beiden Ideone und Coliru.
Ihre monströse Hässlichkeit ist oben; ich würde es hinter Spoiler um Ihre Augen zu schützen, wenn ich wüsste wie, aber markdown mag mich nicht.
Der Bibliothek (verschmolzen in einer einzigen header-Datei)
Nutzung
Zusammenstellung (kopieren-einfügen-Kopfzeile im
main.cpp
)- Ausgang
InformationsquelleAutor der Antwort PlasmaHH
Generieren Sie einfach Ihren Enumerationen. Schreiben Sie einen generator für diesen Zweck ist etwa fünf Minuten zu arbeiten.
Code Generator in java und python, super einfache Portierung auf beliebige Sprachen, z.B. C++.
Auch super einfach zu verlängern, was auch immer die Funktionalität, die Sie wollen.
Beispiel Eingabe:
generierte header:
generiert cpp-Datei
Und der generator in einer sehr knappen form als Vorlage für die Portierung und Erweiterung. Dieser Beispiel-code wirklich versucht, zu vermeiden, das überschreiben von Dateien, aber immer noch verwenden Sie es auf Ihr eigenes Risiko.
Sowie einen port für Python-3.5 da unterschiedliche genug, um potenziell hilfreich
InformationsquelleAutor der Antwort yeoman
Nahm ich die Idee von @antron und implementiert es anders: Erzeugung einer echten enum-Klasse.
Diese Implementierung erfüllt alle Anforderungen aufgelistet in der ursprünglichen Frage, aber derzeit hat nur ein wirkliche Einschränkung: es übernimmt die enum-Werte sind entweder nicht vorhanden oder, wenn vorhanden, muss starten bei 0 und gehen bis sequentiell ohne Lücken.
Dies ist nicht eine immanente Beschränkung - einfach, ich benutze keine ad-hoc-enum-Werte. Wenn dies erforderlich ist, kann man ersetzen Vektor-lookup mit traditionellen switch - /case-Umsetzung.
Die Lösung nutzt eine c++17 für inline-Variablen, aber dies kann leicht vermieden werden, wenn nötig. Es nutzt auch boost:trim wegen der Einfachheit.
Am wichtigsten ist, dauert es nur 30 Zeilen code und keine schwarze Magie Makros.
Der code ist unten. Es soll gesetzt werden, im header und in mehreren compilation-Module.
Kann es verwendet werden, die gleiche Weise wie zuvor in diesem thread:
Pls lassen Sie mich wissen, wenn dies sinnvoll ist und wie es weiter verbessert werden kann.
InformationsquelleAutor der Antwort Yuri Finkelstein
Folgende Lösung basiert auf einer
std::array<std::string,N>
für eine bestimmte enum.Für
enum
zustd::string
Umstellung können wir nur werfen die enum zusize_t
und Suche den string aus dem array. Die operation ist O(1) und erfordert keine heap.Für
std::string
zuenum
Bekehrung, die wir haben würden, um eine lineare Suche über das Feld und warf den array-index zuenum
.Versuchen Sie es hier mit Syntax-Beispiele: http://coliru.stacked-crooked.com/a/e4212f93bee65076
Edit: überarbeitung meiner Lösung, so dass die benutzerdefinierten Enum können innerhalb einer Klasse verwendet werden.
InformationsquelleAutor der Antwort FKaria
Lösungen mit enum innerhalb der Klasse/struct (struct standardmäßig mit öffentlichen Mitglieder) und das überladen von Operatoren:
Von außen sieht es fast genau so wie ein Klasse enum:
Dieser Ausgabe wird "red 1 2". Man könnte vielleicht überlastung << blau-Ausgabe ein string (obwohl es könnte dazu führen Mehrdeutigkeit so nicht möglich), aber es würde nicht funktionieren mit Farbe::GRÜN da es nicht automatisch konvertieren Farbe.
Dem Zweck dient, eine implizite konvertieren von Enum (die implizit konvertiert zu int oder Typ) ist in der Lage sein zu tun:
Dies funktioniert, aber es bedeutet auch, dass diese Arbeit auch:
Mit einer enum-Klasse, es würde nicht kompilieren.
Sie sollten vorsichtig sein, wenn Sie überlastung beiden Funktionen unter dem enum und integer, oder entfernen Sie die implizite Konvertierung...
Andere Lösung würde bedeuten, mit einer tatsächlichen enum-Klasse und static-member:
Es möglicherweise mehr Platz in Anspruch nimmt, und ist mehr zu machen, sondern führt zu einem Kompilierfehler für implizite int-Konvertierungen. Ich würde diese benutzen!
Es ist sicherlich Aufwand mit dieser, obwohl, aber ich denke, es ist nur einfacher und sieht besser aus als andere code, den ich gesehen habe. Es gibt auch Potenzial für das hinzufügen von Funktionalität, die alle eingeschränkt werden innerhalb der Klasse.
Bearbeiten: das funktioniert und die meisten werden vor der Ausführung kompiliert:
InformationsquelleAutor der Antwort Pat-Laugh
Diese gist bietet eine einfache Zuordnung basierend auf C++ variadic-Vorlagen.
Dies ist ein C++ - 17-vereinfachte version des Typ-basierte Karte aus dem gist:
Beispiel:
Den
map<KeyValues...>
kann in beiden Richtungen verwendet werden:fasion_names::get(fasion::emo)
fasion_names::get("emo")
Diesem Beispiel ist auf godbolt.org
Ergebnis von
gcc-7 -std=c++1z -Ofast -S
InformationsquelleAutor der Antwort hutorny
Sehr einfache Lösung mit einer großen Einschränkung: Sie können nicht zuweisen einer benutzerdefinierten Werte zu
enum
Werte, aber mit den richtigen regex könnte man. man könnte auch hinzufügen, eine Karte zu übersetzen, zurück zuenum
Werte ohne viel Aufwand:Beispiel:
InformationsquelleAutor der Antwort malem
Ich war frustriert über dieses problem für eine lange Zeit auch, zusammen mit dem problem der immer ein Typ in eine Zeichenfolge konvertiert, die in einem richtigen Weg. Jedoch für das Letzte problem, ich war überrascht von der Lösung erklärt Ist es möglich, drucken Sie die variable Typ in der standard-C++?mit der Idee von Bekomme ich C++ - Typ-Namen in einer constexpr Weg?. Mit dieser Technik wird eine analoge Funktion konstruiert werden kann für immer eine enum-Wert als string:
Den code oben wurde nur getestet auf Clang (siehe https://ideone.com/je5Quv) und VS2015, sollte aber anpassbar sein, um auch andere Compiler durch Experimentieren ein bisschen mit der integer-Konstanten. Natürlich, es noch Makros verwendet unter der Haube, aber zumindest braucht man keine Zugriff auf die enum-Umsetzung.
InformationsquelleAutor der Antwort Ignace
BEARBEITEN: überprüfen Sie unten für eine neuere version
Wie oben erwähnt, N4113 ist die endgültige Lösung dieser Angelegenheit, aber wir müssen warten mehr als a Jahr, um zu sehen, es kommt.
Inzwischen, wenn Sie wollen, dass diese Funktion, müssen Sie greifen, um "einfache" Vorlagen und einige Präprozessor-Magie.
Enumerator
Nutzung
Einfache Erklärung
Enum<T>::m_counter
auf 0 gesetzt ist in jedem namespace-Deklaration.(Könnte mir jemand zeigen heraus, wo ^^dieses Verhalten^^ erwähnt wird, die auf dem standard?)
Die Präprozessor-Magie automatisiert die Erklärung von Enumeratoren.
Nachteile
enum
geben, daher nicht promotable intAlternative Lösung
Diese ein Opfer der Zeilennummerierung (nicht wirklich) kann aber verwendet werden, auf switch Fällen.
Errata
#line 0
Konflikte mit-pedantic
auf GCC und clang.Abhilfe
Starten Sie entweder bei
#line 1
und subtrahieren Sie 1 von__LINE__
.Oder, nicht verwenden
-pedantic
.Und wenn wir schon dabei sind, vermeiden VC++ unter allen Umständen, es war schon immer ein Witz von einem compiler.
Nutzung
Real-life-Umsetzung und Verwendung
r3dVoxel - Enum
r3dVoxel - ELoggingLevel
Kurzanleitung
#Zeile lineno -- cppreference.com
InformationsquelleAutor der Antwort bit2shift
Solange Sie in Ordnung sind, mit schriftlich eine separate
.h/.cpp
paar für jeden queryable enum, diese Lösung funktioniert mit fast den gleichen syntax und Funktionen wie eine normale c++ - enum:Den
.cpp
Datei 3 Zeilen boilerplate:Beispiel:
Code
Diese Lösung erfordert 2 source-Dateien:
...und
Erklärung
Diese Implementierung nutzt die Tatsache, dass die verspannt Liste von Elementen einer enum-definition kann auch verwendet werden, als eine verspannte Initialisierungsliste für die Klasse Mitglied der Initialisierung.
Wenn
ETRAITS
wird ausgewertet im Kontext derEnumTraits.inl
es baut sich eine statische member-definition für die
EnumTraits<>
Klasse.Den
EDECL
makro wandelt jede enum-Mitglied in Initialisierer-Liste-Werte, die anschließend übergeben bekommen in den Mitglied-Konstruktor, um zu füllen Sie die enum-info.Den
EnumInitGuard
Klasse ist entworfen, um zu konsumieren, die enum-Initialisierung-Werte und dann zusammenbrechen und hinterlässt eine Reine Liste von enum-Daten.Vorteile
c++
-ähnliche syntaxenum
undenum class
(fast*)enum
Typen mit beliebiger numerischer zugrunde liegenden Typenum
Typen mit automatic, explicit und fragmentiert Initialisierer Werte*
Im Gegensatz zuenums
Initialisierungen inenum class
Typen, die Verweise auf andere Werte, die von den gleichen enum müssen diese Werte voll qualifizierteDisbenefits
.h/.cpp
paar für jeden queryableenum
macro
undinclude
Magieclass
odernamespace
scoped enums nicht trivial ist,Kommentare
Intellisense wird sich beschweren, ein bisschen über die privaten member zugreifen, wenn die öffnung
EnumTraits.inl
aber da die expandierten Makros eigentlich sind, definieren Sie die Schüler, das ist nicht wirklich ein problem.Den
#ifndef ENUM_INCLUDE_MULTI
block an der Spitze der header-Datei ist eine geringfügige ärgernis, dass könnte wahrscheinlich werden geschrumpft nach unten in ein makro oder so, aber es ist klein genug, um mit zu Leben in der aktuellen Größe.Deklarieren einen namespace scoped enum erfordert, dass die enum-erste vorwärts erklärt im namespace-Gültigkeitsbereich, dann definiert in den globalen Namensraum. Darüber hinaus wird jeder enum-Initialisierungen mit den Werten der gleichen enum müssen diese Werte voll qualifizierte.
InformationsquelleAutor der Antwort Jason Lim
Schrieb ich eine Bibliothek für die Lösung des Problems, alles geschieht zu kompilieren, außer für die Meldung bekommen.
Verwendung:
Makro benutzen
DEF_MSG
zum definieren einer makro-und message-pair-Mädchen:CODE_OK
ist das makro zu verwenden, und"OK!"
ist die entsprechende Nachricht.Verwenden
get_message()
oder nurgm()
die Nachricht bekommen:Verwenden
MSG_NUM
um herauszufinden, wie viele Makros definiert wurden. Diese wird automatisch increse, Sie brauchen nicht, etwas zu tun.Vordefinierte Meldungen:
Projekt: libcodemsg
Die Bibliothek erzeugt keine zusätzlichen Daten. Alles passiert bei der Zusammenstellung der Zeit. In
message_def.h
wird, generiert es eineenum
genanntMSG_CODE
; inmessage_def.c
es erzeugt eine variable hält alle Fäden instatic const char* _g_messages[]
.In diesem Fall die Bibliothek ist begrenzt, um eine zu erstellen
enum
nur. Dies ist ideal für die Werte zurückgeben, zum Beispiel:Andere Sache, ich mag dieses design ist, können Sie verwalten message-Definitionen in verschiedene Dateien.
Fand ich die Lösung zu diese Frage sieht viel besser aus.
InformationsquelleAutor der Antwort Madwyn
Beispiel
automatisch ENUM_MAKE makro erzeugen 'enum-Klasse' und helper-Klasse mit 'enum-Reflexion-Funktion'.
Zur Reduzierung der Fehler, das auf einmal Alles definiert ist, mit nur einem ENUM_MAKE.
Der Vorteil dieses Codes ist automatisch erstellt, für Reflexion und einen genauen Blick auf makro-code ,einfach-zu-verstehen von code. 'enum zu string' , 'string zu enum' Leistung des Algorithmus ist O(1).
Nachteile ist bei der ersten Verwendung , helper-Klasse für enum-Reflexion 's string-Vektor und die Karte wird initialisiert.
aber Wenn Sie wollen, Sie werden auch vor-initialisiert. –
InformationsquelleAutor der Antwort desperado_98
meine Lösung ist ohne makro-Nutzung.
Vorteile:
Nachteile:
so... bis zu dem Tag, dass C++ implementiert, die C# - Enum.Analysieren, Funktionalität, ich hängen werden:
InformationsquelleAutor der Antwort Mia Shani
Gut, noch eine andere option. Ein typischer Anwendungsfall ist, wo Sie müssen Konstanten für die HTTP-Verben als auch mit seinen string-version zu Werten.
Beispiel:
Dem VERB Klasse:
InformationsquelleAutor der Antwort cibercitizen1
Was über eine einfache streaming-überlastung?
Haben Sie immer noch pflegen Sie die Zuordnung, wenn Sie nicht wollen, zu tun, einige makro-Magie, aber ich finde es sauberer ist als die ursprüngliche Lösung.
InformationsquelleAutor der Antwort dau_sama