16

C ++で連続した値を持つ列挙型を反復処理するための好ましい単純な方法は何ですか? カスタムの作成などを含む、この件に関する以前のSOの質問を見つけましoperator++たが、これはやり過ぎのようです。これまでのところ、私が思いついた最高のものは次のとおりです。

enum {
   FOO,
   BAR,
   BLECH,
   NUM_ENUMS
} MyEnum;

//for (MyEnum m = FOO; m < NUM_ENUMS; ++m)             // compile error
//    ...

//for (MyEnum m = FOO; m < NUM_ENUMS; m = m + 1)       // compile error
//    ...

for (MyEnum m = FOO; m < NUM_ENUMS; m = MyEnum(m + 1)) // OK ?
    ...

これはコーディングスタイルの観点から合理的であり、警告を生成する可能性がありますか (g++ -Wall ...これに満足しているようです)?

4

2 に答える 2

14

それは確かに安全です。

これは未定義MyEnum(int(NUM_ENUMS) + 1)でした。保持する値 (4) は、列挙型が表すことができる値 ([0, 3]) よりも大きいためです。安全に使用できるmよりも厳密に低いことを確認するためです。NUM_ENUMSMyEnum(m + 1)

一方、次のようなカスタマイズされた列挙型には問題があることに注意してください。

enum OtherEnum {
    Foo = -1,
    Bar = 2,
    Baz = 8,
    NUM_OTHERENUM
};

したがって、それは一般的な慣行ではありません。

代わりに、生成された配列を反復処理することをお勧めします。

MyEnum const Values[] = { FOO, BAR, BLECH };

これは列挙型の定義から簡単に生成できることに注意してください。また、無意味な値でインターフェイスを汚染することも避けてください (ビジネス的に)。

于 2013-06-20T11:21:50.837 に答える