Jump to content
  • Advertisement
Sign in to follow this  
raptorstrike

From String to Enum

This topic is 4686 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I was just wondering if there was a simple way to convert the content of a string into an enumerated const name (not the value, the index name) without having to go through a system of 'if' s ( I was thinking something along the lines of a cast). C++ thanks [smile]

Share this post


Link to post
Share on other sites
Advertisement
You can set up a map, but there's no straightforward automatic way to do it as C++ lacks reflection.

Share this post


Link to post
Share on other sites
It seems like id seen it done before by my c++ prof, but i dont remember. Do a little more research; seemed like it had something to do with an array of strings....

Share this post


Link to post
Share on other sites
Quote:
Original post by BTownTKD
It seems like id seen it done before by my c++ prof, but i dont remember. Do a little more research; seemed like it had something to do with an array of strings....

One way is a parallel array of strings to the enum:


enum SomeEnum
{
eFoo = 0,
eBar,
eBaz
}

char* someEnumNames[] = { "eFoo", "eBar", "eBaz" };

(please forgive the crappy psedo-code)

Then conversion involves linearly scanning though the enum names array until a match is found, at which point the array index can just be cast to the enum.

Unfortunately:
- It's fragile, enums and names must always be kept manually in sync, whereas a map does all of this for you
- Time is O(n), whereas a map would be O(log n)
- If needed the map can be sparse (ie. only a few enum strings map to an enum value). The array method requires your array to be as long as you have enums.
- You enums all need to be sequential (non-zero based is ok, but again adds fragility). A map can handle any enum values.

Share this post


Link to post
Share on other sites
This creates an enum and a corresponding array of strings that are automatically kept in synch.
    #define COLOR_LIST              \ 
ENUM_OR_STRING( Black ), \
ENUM_OR_STRING( Red ), \
ENUM_OR_STRING( Green ), \
ENUM_OR_STRING( Blue ), \
ENUM_OR_STRING( Cyan ), \
ENUM_OR_STRING( Magenta ), \
ENUM_OR_STRING( Yellow ), \
ENUM_OR_STRING( White )

#define ENUM_OR_STRING( x ) x
enum Colors
{
COLOR_LIST
};

#undef ENUM_OR_STRING
#define ENUM_OR_STRING( x ) #x
char const * colorsNames[] =
{
COLOR_LIST
};
The multi-line macro makes managing the list difficult. An alternative is to put the list in a header file:

colors.h
        ENUM_OR_STRING( Black ),
ENUM_OR_STRING( Red ),
ENUM_OR_STRING( Green ),
ENUM_OR_STRING( Blue ),
ENUM_OR_STRING( Cyan ),
ENUM_OR_STRING( Magenta ),
ENUM_OR_STRING( Yellow ),
ENUM_OR_STRING( White )

and use it like this:
    #define ENUM_OR_STRING( x ) x
enum Colors
{
#include "colors.h"
};

#undef ENUM_OR_STRING
#define ENUM_OR_STRING( x ) #x
char const * colorsNames[] =
{
#include "colors.h"
};

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!