c++: Using X Macro to define enum and string array inside class?
Using C++ (Visual Studio). I'm trying to find a solution for converting an enum to a string. I came across X Macros (http://drdobbs.com/cpp/184401387) which seems to be a reasonable solution but I'm having a hard time getting it to work inside of a class. All the examples I've seen show everything defined outside of a class.
// ColorNames.h
X(Red, "Red"),
X(Blue, "Blue"),
...
// MyClass.h
class MyClass
{
public:
    MyClass();
    virtual ~MyClass();
    #define X(a, b) a
    enum Colors {
        #include "ColorNames.h"
    };
    #undef X
    #define X(a, b) b
    char *colorNameStrings_[] = {
        #include "ColorNames.h"
    };
    #undef X
}
The IDE chokes on the line *colorNameStrings_[] =... I guess because you can't initialize a data member variable 开发者_开发技巧in the header file?  How do I get this to work?
The problem is that you can't initialize a non static constant inside a class definition.
You would probably have to do it like that:
// MyClass.h
class MyClass
{
public:
    MyClass();
    virtual ~MyClass();
    #define X(a, b) a
    enum Colors {
        #include "ColorNames.h"
    };
    #undef X
    static const char * colorNameStrings_[];
};
And in the .cpp file:
// MyClass.cpp
#include "MyClass.h"
#define X(a, b) b
const char * MyClass::colorNameStrings_[] = {
    #include "ColorNames.h"
};
#undef X
Instead of using X-Macros, consider using the Boost.Preprocessor library. The initial, one-time definition of the code generation macros takes a bit of work, but the end result is far cleaner and much easier to reuse.
I provided a basic implementation of a generic, Boost.Preprocessor-based enum-to-string-name conversion in an answer to "How to convert an enum type variable to a string?"
Use a struct like this
struct convert
{
     std::map<MyEnum, std::string> mapping;
     convert() 
     { 
          mapping[SOME_ENUM_VALUE] = "SomeValue"; 
          // etc to fill map
     }
     std::string operator()(MyEnum enum)
     {
         return mapping[enum];    
     }
};
Then use like this:
convert c;
std::string ret = c(myenum);  //calls operator()
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论