2

我有以下枚举和地图:

typedef enum {
    MaxX = 0,
    MaxY,
    MaxCells,
    MaxCycles,
    Threes
} SettingName;

typedef std::map<SettingName, const char*> SettingNameCollection;

SettingNameCollection settingNames;

我有以下函数来返回枚举名称:

const char* gofBoard::getSettingName(unsigned x) {
    return settingNames[static_cast<SettingName>(x)];
}

从我读过的内容来看,这应该可以工作,但该函数不返回任何内容。没有编译时错误,也没有运行时错误。

4

5 回答 5

4

这是我的建议:

1-写这个宏:

#define SMART_STRINGIFY_CASE(ENUM_CODE) case ENUM_CODE: return # ENUM_CODE

2-编写此函数:

const char* SettingNamesToString( settingNames const input)
{
  switch(input)
  {
    SMART_STRINGIFY_CASE(MaxX);
    SMART_STRINGIFY_CASE(MaxY);
    ...
  default:
    // your own ! 
}
于 2012-12-13T07:38:44.007 回答
1

operator[]用于在 std::map 中检索/插入数据。您可能更符合std::map::find

const char* gofBoard::getSettingName(unsigned x) {
    auto found = settingNames.find(static_cast<SettingName>(x));
    if (found == settingNames.end())
        /* throw appropriate exception */
    /* or assert */
    assert ( found != settingNames.end() );
    return found->second;
}

编辑:就像有人说的那样,为了您的目的,一个简单的std::array就足够了。

于 2012-12-13T07:23:33.633 回答
0

如果您在调用该函数之前没有填充地图,那么您得到的不是错误,它是一个空白字符串(我猜)

你想做这样的事情

typedef std::array<const char*,Threes+1> SettingNameCollection;  
// usually for such purposes, sometimes an extra enum is added to give you number of valid enum values ( Settings_Num for instance)

SettingNameCollection settingNames {
    "MaxX ",
    .....
    "Threes",
}; // first time using the new syntax, is this correct?

const char* gofBoard::getSettingName(SettingName setting) {
    return settingNames[setting]; //do i need to cast to int in c++11?
}
于 2012-12-13T07:20:10.893 回答
0

map如果您的枚举是连续的,A肯定是矫枉过正。我建议切换到宏定义

摘抄:

SANDBOX_DEFINE_ENUM(MyEnum, (Foo)(Bar)(Team))

将扩展为:

struct MyEnum {
  enum Type {
    Foo,
    Bar,
    Team
  };
  static Type const First = Foo;
  static Type const Last = Team;
};

inline char const* toString(MyEnum::Type value) {
  switch(value) {
  case MyEnum::Foo: return "Foo";
  case MyEnum::Bar: return "Bar";
  case MyEnum::Team: return "Team";
  }
  return 0;
}
于 2012-12-13T08:10:56.170 回答
0

每个广泛使用 C++ 编程的人都遇到过枚举到字符串转换(以及字符串到枚举转换)的问题。要很好地解决问题,需要考虑多个方面,例如,如果请求了无效枚举的字符串怎么办。我认为您将受益于使用可用于大多数或所有枚举的通用解决方案。这个问题涵盖了这个问题:

您使用的是 C++ 中的哪个类型安全枚举?

于 2012-12-13T08:50:17.360 回答