Maison >développement back-end >C++ >Comment puis-je imprimer les valeurs C Enum sous forme de texte sans utiliser les instructions if/switch ?

Comment puis-je imprimer les valeurs C Enum sous forme de texte sans utiliser les instructions if/switch ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-27 19:24:15512parcourir

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

Impression de valeurs d'énumération sous forme de texte sans if/switch en C

En C, les énumérations fournissent un moyen d'attribuer des valeurs entières aux noms symboliques. Cependant, lors de l'impression d'une valeur d'énumération sur la console, elle affiche généralement l'entier associé au lieu du nom symbolique.

Pour surmonter cette limitation et imprimer les valeurs d'énumération sous forme de texte, explorons trois solutions efficaces :

1. Utilisation d'une carte :

L'utilisation d'un std::map permet une recherche efficace des valeurs d'énumération dans leurs représentations textuelles correspondantes.

#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. Utilisation d'un tableau de structures avec recherche linéaire :

Cette approche consiste à créer un tableau de structures, chacune contenant une valeur d'énumération et son texte correspondant. La recherche linéaire est ensuite utilisée pour récupérer le texte de la valeur d'énumération souhaitée.

#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. Utilisation de switch/case :

Bien que moins efficace que l'approche map, switch/case peut également être utilisé pour mapper des valeurs d'énumération sur du texte.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn