【问题标题】:Enum to String C++ [duplicate]枚举到字符串 C++ [重复]
【发布时间】:2011-09-11 00:10:59
【问题描述】:

我通常发现我需要在 c++ 中将枚举转换为字符串

我总是这样做:

enum Enum{ Banana, Orange, Apple } ;

char * getTextForEnum( int enumVal )
{
  switch( enumVal )
  {
  case Enum::Banana:
    return "bananas & monkeys";
  case Enum::Orange:
    return "Round and orange";
  case Enum::Apple:
    return "APPLE" ;

  default:
    return "Not recognized..";
  }
}

有没有更好的或公认的习惯用法?

【问题讨论】:

  • 也许使用std::map<int, std::string>而不是枚举和开关?通过对对象进行一些封装,您可以使其足够智能,可以作为所有应用程序的错误代码查找和处理程序重用。
  • 一项改进是省略“default:”子句,同时提高编译器的警告级别并将警告视为错误。这样,如果您扩展了枚举列表,编译器会在您的 switch 语句上发出警告并失败,同时提醒您扩展 switch。有人说你应该总是有一个默认值,但我相信这是一个缺乏实际上可以帮助你的场景。

标签: c++ enums


【解决方案1】:
enum Enum{ Banana, Orange, Apple } ;
static const char * EnumStrings[] = { "bananas & monkeys", "Round and orange", "APPLE" };

const char * getTextForEnum( int enumVal )
{
  return EnumStrings[enumVal];
}

【讨论】:

  • 仅适用于连续枚举。
  • @SasQ,我在这里有一个更广泛的答案:stackoverflow.com/a/11586083/5987 该线程中还有很多其他好的建议。
  • @GangaiJohann 只有当它是一个成员函数时。我的做法是尽可能少地更改问题中的代码,以避免不必要的干扰。
  • 还有一个代码生成器:th-thielemann.de/tools/cpp-enum-to-string.html
  • @ekkis 我会使用std::map<std::string,enum>
【解决方案2】:

一种匿名查找表,而不是长的 switch 语句:

return (const char *[]) {
    "bananas & monkeys",
    "Round and orange", 
    "APPLE",
}[enumVal];

【讨论】:

    【解决方案3】:

    您可以将枚举值和字符串放入 STL 映射中。然后就可以这样使用了。

       return myStringMap[Enum::Apple];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多