开发者

c++: Using X Macro to define enum and string array inside class?

开发者 https://www.devze.com 2023-04-04 03:12 出处:网络
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 h

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()
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号