C++ 创建std::pair<;std::string,一些枚举>;通过预处理器
我有一个const static std::map,我想用预处理器填充它。我需要枚举和枚举类型的字符串名称之间的映射。例如: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},
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}