C++ 创建std::pair<;std::string,一些枚举>;通过预处理器

C++ 创建std::pair<;std::string,一些枚举>;通过预处理器,c++,c++14,preprocessor,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},

我有一个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}
};
我的第二个想法是:

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

Thank's

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


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

查找预处理器字符串化操作符。请参阅。对于这种情况,对于映射来说,不区分大小写的比较器似乎是一个很好的例子。或者,也可以调用生成并添加小写版本的方法,而不是
set
。这是一个好主意,谢谢。那很好用。你知道a如何也能插入我的字符串的小写版本吗?你必须为此调用函数(或类似的函数)。或者,如果您使用const char指针并编写了自己的映射比较器(使用stricmp),则可以避免执行降低转换。@GemTaylor:无需切换到const char指针来自定义比较器。
{"RED", Color::RED}, {"red", Color::RED}
#define CREATE(name) {#name, Color::name}