通过预处理器创建std :: pair <std :: string,some_enum =“”>

时间:2018-06-01 16:49:54

标签: c++ c++14 preprocessor

我有一个const static std :: map,我想用预处理器填充它。我想要枚举和枚举类型的字符串名称之间的映射。例如:

enum Color {
  RED,
  BLUE,
  GREEN
};

const static std::map<std::string, Color> = {
  {"RED", Color::RED},
  {"red", Color::RED},
  {"BLUE", Color::BLUE},
  {"blue", Color::BLUE},
  {"GREEN", Color::GREEN}
  {"green", Color::GREEN}
};

这是一个简单的例子。我想写一些类似的东西:

enum Color {
  RED,
  BLUE,
  GREEN
};

const static std::map<std::string, Color> = {
  CREATE(RED),
  CREATE(BLUE),
  CREATE(GREEN)
};

我的枚举中有很多值,你会发现它有很多工作,即使对于一些值也是如此。 我想过使用一些预处理器魔法,但我不知道如何让它工作。我的第一个想法是:

#define(name) {"name", Color::name}

我的第二个想法是:

#define(name) {"(name)", Color::(name)}

在第一种情况下,我得到字符串“name”作为键,在第二种情况下,我得到字符串“(name)”作为键和编译器错误,因为我的值。获得这个问题的解决方案会很棒,即使这不包括字符串的小写版本。这只是一个小小的奖金。 你有什么想法我可以解决我的问题吗?

编辑:感谢@Gem Taylor。我有第一个问题的解决方案:

#define CREATE(name) {#name, Color::name}

如果您知道如何使用小写字符串创建版本,那就太棒了。那样:

CREATE(RED)

会创建:

{"RED", Color::RED}, {"red", Color::RED}

感谢的

1 个答案:

答案 0 :(得分:2)

宏#中有一个特殊的字符串化功能,还有令牌连接##:

#define CREATE(name) {#name, Color::name}

请参阅the gcc docs - 这是C的标准功能。