c ++:使用X Macro在类中定义枚举和字符串数组?

时间:2011-09-08 20:49:13

标签: c++ string enums

使用C ++(Visual Studio)。我正在尝试找到将枚举转换为字符串的解决方案。我遇到了X Macros(http://drdobbs.com/cpp/184401387),这似乎是一个合理的解决方案,但我很难让它在课堂上工作。我见过的所有例子都显示了在课堂外定义的所有内容。

// 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
}

IDE会在*colorNameStrings_[] =...行上窒息,因为你无法初始化头文件中的数据成员变量?我如何让它工作?

3 个答案:

答案 0 :(得分:2)

请考虑使用the Boost.Preprocessor library,而不是使用X-Macros。代码生成宏的初始一次性定义需要一些工作,但最终结果更清晰,更容易重用。

我在回答"How to convert an enum type variable to a string?"

的答案中提供了基于Boost.Preprocessor的通用枚举到字符串名称转换的基本实现。

答案 1 :(得分:2)

问题是你不能在类定义中初始化非静态常量。

您可能必须这样做:

// MyClass.h
class MyClass
{
public:
    MyClass();
    virtual ~MyClass();

    #define X(a, b) a
    enum Colors {
        #include "ColorNames.h"
    };
    #undef X

    static const char * colorNameStrings_[];
};

在.cpp文件中:

// MyClass.cpp
#include "MyClass.h"

#define X(a, b) b
const char * MyClass::colorNameStrings_[] = {
    #include "ColorNames.h"
};
#undef X

答案 2 :(得分:1)

使用像这样的结构

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];    
     }

};

然后像这样使用:

convert c;
std::string ret = c(myenum);  //calls operator()