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
Patricia ArquetteOriginal
2024-11-29 22:55:12508Durchsuche

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,
};

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

Errors anError = ErrorA;
std::cout << anError; // 0 will be printed

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];
}

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;
}

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
    };
}

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;   
}

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

ErrorA
ErrorB
ErrorC

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!

Stellungnahme:
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