2011-05-29 5 views
2

J'ai une énumération que je fais un cout sur, comme dans: cout << myenum.C++ cout et enum représentations

Lorsque je débogue, je peux voir la valeur sous la forme d'une valeur entière mais lorsque cout la recrache, elle apparaît comme la représentation du texte.

Une idée de ce que fait cout dans les coulisses? J'ai besoin de ce même type de fonctionnalité, et il existe des exemples de conversion de valeurs enum en chaîne, mais il semble que nous ayons besoin de savoir quelles sont ces valeurs à l'avance. Dans mon cas, je ne le fais pas. J'ai besoin de prendre n'importe quel olum et obtenir sa représentation de texte. En C# c'est un morceau de gâteau; C++ .. pas facile du tout.

Je peux prendre la valeur entière si j'en ai besoin et la convertir de manière appropriée, mais la chaîne me donnerait exactement ce dont j'ai besoin.

MISE À JOUR:

Merci beaucoup à tous ceux qui ont contribué à cette question. En fin de compte, j'ai trouvé ma réponse dans un code enfoui. Il y avait une méthode pour convertir la valeur enum en une chaîne représentant le mouvement réel comme "exd5" ce que vous avez. Dans cette méthode, cependant, ils faisaient des trucs assez sauvages que je reste loin de la forme pour le moment. Mon objectif principal était d'arriver à la représentation de la chaîne.

+2

"lorsque" cout "le recrache, il apparaît comme la représentation du texte" - Êtes-vous sûr de cela? Si oui, quelque chose ne va pas du tout! S'il vous plaît poster le code de démonstration. –

+1

@Neil: Mauvais? Comment la conversion native d'IOStreams d '«int» en une représentation lexicale est-elle «fausse»? [edit: ah, vous lisez comme dans la représentation du symbole enum] –

Répondre

0

Cette fonctionnalité provient de la bibliothèque IOStreams. std::cout est un std::ostream.

std::stringstream est également un std::ostream.

int x = 5; 
std::stringstream ss; 
ss << x; 

// ss.str() is a string containing the text "5" 
3

Enum.hpp:

enum Enum { 
    FOO, 
    BAR, 
    BAZ, 
    NUM_ENUMS 
}; 

extern const char* enum_strings[]; 

Enum.cpp:

const char* enum_strings[] = { 
    "FOO", 
    "BAR", 
    "BAZ", 
    "NUM_ENUMS", 
    0 }; 

Ensuite, quand je veux sortir la représentation symbolique de l'ENUM, j'utilise std::cout << enum_strings[x].

Ainsi, vous avez besoin de connaître les valeurs de chaîne, mais seulement dans un endroit — pas partout où vous utilisez ceci.

+0

Cela sûrement le ferait. Comme l'un de mes commentaires ci-dessus, je ne connais pas les valeurs au moment du design. Je suppose que je pourrais construire dynamiquement une table de hachage avec des paires de valeurs clés, et y accéder par le "int" je reviens. Merci pour votre exemple de code. – David

+0

Si vous ajoutez un nouvel élément à 'Enum' et oubliez d'ajouter une nouvelle chaîne à' enum_strings', vous pourriez vous retrouver avec un comportement indéfini. – Steve