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

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

Susan Sarandon
Susan SarandonOriginal
2024-11-27 19:24:15512Durchsuche

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

Aufzählungswerte als Text ohne if/switch in C drucken

In C bieten Aufzählungen eine Möglichkeit, symbolischen Namen ganzzahlige Werte zuzuweisen. Beim Drucken eines Enum-Werts auf der Konsole wird jedoch normalerweise die zugehörige Ganzzahl anstelle des symbolischen Namens ausgegeben.

Um diese Einschränkung zu überwinden und Enum-Werte als Text zu drucken, untersuchen wir drei effiziente Lösungen:

1. Verwenden einer Karte:

Die Verwendung einer std::map ermöglicht eine effiziente Suche von Enum-Werten in ihren entsprechenden Textdarstellungen.

#include <map>
#include <string_view>

enum Errors { ErrorA = 0, ErrorB, ErrorC };

// Custom insertion function for map
#define INSERT_ELEMENT(p) result.emplace(p, #p);

// Initialize the map
static const auto strings = []() {
    std::map<Errors, std::string_view> result;
    INSERT_ELEMENT(ErrorA);
    INSERT_ELEMENT(ErrorB);
    INSERT_ELEMENT(ErrorC);
    return result;
};

std::ostream& operator<<(std::ostream& out, const Errors value) {
    return out << strings[value];
}

2. Verwenden eines Arrays von Strukturen mit linearer Suche:

Bei diesem Ansatz wird ein Array von Strukturen erstellt, von denen jede einen Aufzählungswert und den entsprechenden Text enthält. Anschließend wird die lineare Suche verwendet, um den Text für den gewünschten Enum-Wert abzurufen.

#include <string_view>

enum Errors { ErrorA = 0, ErrorB, ErrorC };

// Structure for mapping enum to text
struct MapEntry {
    Errors value;
    std::string_view str;
};

std::ostream& operator<<(std::ostream& out, const Errors value) {
    const MapEntry entries[] = {
        {ErrorA, "ErrorA"},
        {ErrorB, "ErrorB"},
        {ErrorC, "ErrorC"}
    };

    const char* s = nullptr;
    for (const MapEntry* i = entries; i->str; i++) {
        if (i->value == value) {
            s = i->str;
            break;
        }
    }

    return out << s;
}

3. Verwendung von switch/case:

Obwohl es weniger effizient als der Map-Ansatz ist, kann switch/case auch zum Zuordnen von Enum-Werten zu Text verwendet werden.

#include <string>

enum Errors { ErrorA = 0, ErrorB, ErrorC };

std::ostream& operator<<(std::ostream& out, const Errors value) {
    return out << [value]() {
        switch (value) {
            case ErrorA: return "ErrorA";
            case ErrorB: return "ErrorB";
            case ErrorC: return "ErrorC";
        }
    };
}

Das obige ist der detaillierte Inhalt vonWie kann ich C-Enum-Werte als Text drucken, 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