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

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

その関数を呼び出す前にマップにデータを入力しない場合、得られるのはエラーではなく、空白の文字列です (私は推測しています)

あなたはこのようなことをしたい

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

C++ で大規模なプログラミングを行っている人なら誰でも、列挙型から文字列への変換 (および文字列から列挙型への変換) の問題に遭遇したことがあります。問題を適切に解決するために考慮すべきさまざまな側面があります。たとえば、無効な列挙型の文字列が要求された場合などです。ほとんどまたはすべての列挙型に使用できる汎用ソリューションを使用することでメリットが得られると思います。その問題はこの質問でカバーされています:

C++ でどの Typesafe Enum を使用していますか?

于 2012-12-13T08:50:17.360 に答える