Maison >développement back-end >C++ >Comment puis-je imprimer les valeurs C Enum sous forme de texte lisible par l'homme sans utiliser les instructions Switch/If ?

Comment puis-je imprimer les valeurs C Enum sous forme de texte lisible par l'homme sans utiliser les instructions Switch/If ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-29 22:08:13924parcourir

How Can I Print C   Enum Values as Human-Readable Text Without Using Switch/If Statements?

C : Impression de valeurs d'énumération au format texte

Dans le domaine de la programmation, les énumérations (énumérations) sont souvent utilisées pour attribuer des valeurs numériques à États ou catégories distincts. Cependant, lorsqu'il s'agit d'énumérations, il devient nécessaire de transmettre leurs valeurs dans un format textuel plus significatif pour une meilleure lisibilité et compréhension.

Le problème : traduire les valeurs d'énumération en texte

Considérons une énumération définie comme suit :

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

Maintenant, essayons d'imprimer la valeur d'une énumération variable :

Errors anError = ErrorA;
std::cout << anError; // Will print "0" instead of "ErrorA"

Le défi ici réside dans la conversion de la valeur numérique de l'énumération en sa représentation textuelle correspondante.

Solutions sans utiliser Switch/If

1. Utilisation d'une carte :

Une approche consiste à utiliser une carte pour établir une correspondance entre les valeurs d'énumération et leurs représentations textuelles :

#include <map>
#include <string_view>

// Create a map that associates enum values with string views
std::map<Errors, std::string_view> errorTextMap = {
    {ErrorA, "ErrorA"},
    {ErrorB, "ErrorB"},
    {ErrorC, "ErrorC"},
};

// Overload the << operator to handle enum values
std::ostream&amp; operator<<(std::ostream&amp; out, const Errors value) {
    return out << errorTextMap[value];
}

2. Utilisation d'un tableau de structures avec recherche linéaire :

Une solution alternative consiste à créer un tableau de structures :

#include <string_view>

// Define a structure to store enum values and text representations
struct MapEntry {
    Errors value;
    std::string_view str;
};

// Create an array of structures containing the mapping
const MapEntry errorTextEntries[] = {
    {ErrorA, "ErrorA"},
    {ErrorB, "ErrorB"},
    {ErrorC, "ErrorC"},
    {ErrorA, 0} // Dummy entry to terminate the search
};

// Overload the << operator to handle enum values
std::ostream&amp; operator<<(std::ostream&amp; out, const Errors value) {
    const char* s = nullptr;
    for (const MapEntry* i = errorTextEntries; i->str; i++) {
        if (i->value == value) {
            s = i->str;
            break;
        }
    }

    return out << s;
}

Tester les solutions :

Pour démontrer la fonctionnalité du proposé solutions :

#include <iostream>

int main() {
    std::cout << ErrorA << std::endl;
    std::cout << ErrorB << std::endl;
    std::cout << ErrorC << std::endl;

    return 0;
}

Sortie :

ErrorA
ErrorB
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