Maison >développement back-end >C++ >Comment convertir automatiquement les énumérations C en chaînes sans modifier le code source ?

Comment convertir automatiquement les énumérations C en chaînes sans modifier le code source ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-17 18:51:16418parcourir

How to Automatically Convert C   Enums to Strings Without Modifying Source Code?

Comment convertir des énumérations C en chaînes

Lorsque vous travaillez avec des énumérations C nommées, vous pouvez rencontrer des scénarios dans lesquels la conversion d'une valeur d'énumération en sa correspondante la représentation sous forme de chaîne est nécessaire. Bien que plusieurs approches existent pour cette conversion, cet article répond à une requête spécifique concernant la génération de fonctions permettant de convertir toutes les énumérations d'un projet en chaînes sans modifier le code source.

X-Macros : une solution complète

L'approche recommandée consiste à utiliser des macros X. Un exemple d'implémentation est présenté ci-dessous :

#include <iostream>

enum Colours {
#   define X(a) a,
#   include "colours.def"
#   undef X
    ColoursCount
};

char const* const colours_str[] = {
#   define X(a) #a,
#   include "colours.def"
#   undef X
    0
};

std::ostream&amp; operator<<(std::ostream&amp; os, enum Colours c)
{
    if (c >= ColoursCount || c < 0) return os << "???";
    return os << colours_str[c];
}

int main()
{
    std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl;
}

Dans le fichier colours.def, définissez les énumérations comme suit :

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)

Cette méthode offre un moyen flexible de générer des fonctions de conversion pour tous énumérations dans votre projet sans apporter aucune modification à votre code source.

Chaîne personnalisable Génération

Vous pouvez également opter pour une méthode qui permet de personnaliser les représentations sous forme de chaîne générées. L'extrait de code suivant illustre comment y parvenir :

#define X(a, b) a,
#define X(a, b) b,

X(Red, "red")
X(Green, "green")
// etc.

Cette approche offre un meilleur contrôle sur les chaînes générées et peut être particulièrement utile lorsque vous avez besoin de personnalisations spécifiques pour votre application.

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