【问题标题】:Create std::pair<std::string, some_enum> via preprocessor [duplicate]通过预处理器创建 std::pair<std::string, some_enum> [重复]
【发布时间】:2018-11-11 20:38:59
【问题描述】:

我有一个 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}

谢谢

【问题讨论】:

  • 查找预处理器字符串化操作符。
  • 对于这种情况,对于您的地图来说,不区分大小写的比较器似乎是一个很好的案例。或者,代替set,调用一个生成并添加小写版本的方法。

标签: c++ c++14 preprocessor


【解决方案1】:

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

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

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

【讨论】:

  • 明确地说,这不是 gcc 功能。这是standard feature
  • 谢谢。这很完美。你知道如何插入我的字符串的小写版本吗?
  • 您必须为此调用函数(或类似函数)。
  • 另外,如果您使用 const char 指针并编写自己的使用 stricmp 的映射比较器,那么您可以避免进行向下转换。
  • @GemTaylor:无需切换到 const char 指针来自定义比较器。
猜你喜欢
  • 2022-01-20
  • 2011-10-29
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2019-08-11
  • 2011-09-24
  • 1970-01-01
相关资源
最近更新 更多