Heim > Backend-Entwicklung > C++ > Wie drucke ich C-Enum-Werte als Text, ohne if/switch-Anweisungen zu verwenden?

Wie drucke ich C-Enum-Werte als Text, ohne if/switch-Anweisungen zu verwenden?

Patricia Arquette
Freigeben: 2024-11-29 22:55:12
Original
506 Leute haben es durchsucht

How to Print C   Enum Values as Text Without Using if/switch Statements?

Enum-Werte als Text in C ohne if/switch drucken

In C bieten Enums eine praktische Möglichkeit, einen Satz benannter Konstanten darzustellen. Beim Drucken eines Aufzählungswerts besteht das Standardverhalten jedoch darin, seine numerische Darstellung anzuzeigen.

Angenommen, wir haben eine Aufzählung wie diese:

enum Errors {
    ErrorA = 0,
    ErrorB,
    ErrorC,
};
Nach dem Login kopieren

Wenn wir versuchen, einen Aufzählungswert mit zu drucken std::cout:

Errors anError = ErrorA;
std::cout << anError; // 0 will be printed
Nach dem Login kopieren

Wir erhalten den numerischen Wert 0 anstelle der Textdarstellung „ErrorA“. Dieses Problem tritt auf, weil std::cout keine integrierte Unterstützung für die Konvertierung von Aufzählungen in Zeichenfolgen bietet.

Lösungen

1. Verwenden einer Karte

Ein Ansatz besteht darin, eine Karte zu erstellen, die jeden Enum-Wert mit seiner Textdarstellung verknüpft:

#include <map>
#include <string_view>

std::ostream& operator<<(std::ostream& out, const Errors value) {
    static const auto strings = [] {
        std::map<Errors, std::string_view> result;
        #define INSERT_ELEMENT(p) result.emplace(p, #p);
        INSERT_ELEMENT(ErrorA);     
        INSERT_ELEMENT(ErrorB);     
        INSERT_ELEMENT(ErrorC);             
        #undef INSERT_ELEMENT
        return result;
    };

    return out << strings[value];
}
Nach dem Login kopieren

2. Verwenden eines Arrays von Strukturen mit linearer Suche

Eine andere Möglichkeit besteht darin, ein Array von Strukturen zu verwenden, die jeweils einen Enum-Wert und seine Textdarstellung enthalten, und dann eine lineare Suche durchzuführen:

#include <string_view>

std::ostream& operator<<(std::ostream& out, const Errors value) {
#define MAPENTRY(p) {p, #p}
    const struct MapEntry {
        Errors value;
        std::string_view str;
    } entries[] = {
        MAPENTRY(ErrorA),
        MAPENTRY(ErrorB),
        MAPENTRY(ErrorC),
        {ErrorA, 0} //doesn't matter what is used instead of ErrorA here...
    };
#undef MAPENTRY
    const char* s = 0;
    for (const MapEntry* i = entries; i->str; i++) {
        if (i->value == value) {
            s = i->str;
            break;
        }
    }

    return out << s;
}
Nach dem Login kopieren

3. Verwendung von switch/case

Schließlich können wir auch eine switch/case-Anweisung verwenden:

#include <string>

std::ostream& operator<<(std::ostream& out, const Errors value) {
    return out << [value] {
    #define PROCESS_VAL(p) case(p): return #p;
        switch(value) {
            PROCESS_VAL(ErrorA);     
            PROCESS_VAL(ErrorB);     
            PROCESS_VAL(ErrorC);
        }
    #undef PROCESS_VAL
    };
}
Nach dem Login kopieren

Testen der Lösungen:

Um diese Lösungen zu testen, können wir eine ausführbare Datei mit dem folgenden Code erstellen:

#include <iostream>

int main(int argc, char** argv) {
    std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl;
    return 0;   
}
Nach dem Login kopieren

Das Ausführen dieser ausführbaren Datei sollte eine Ausgabe ergeben die Textdarstellungen der Enum-Werte:

ErrorA
ErrorB
ErrorC
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie drucke ich C-Enum-Werte als Text, ohne if/switch-Anweisungen zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage