使用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_[] =...
行上窒息,因为你无法初始化头文件中的数据成员变量?我如何让它工作?
答案 0 :(得分:2)
请考虑使用the Boost.Preprocessor library,而不是使用X-Macros。代码生成宏的初始一次性定义需要一些工作,但最终结果更清晰,更容易重用。
的答案中提供了基于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()