列挙型を反復処理するにはどうすればいいですか? 質問する

列挙型を反復処理するにはどうすればいいですか? 質問する

enumなどの標準の数学演算子は では使用できないことに気付きました。+++=

では、C++ ですべての値を反復処理する最良の方法は何でしょうかenum?

ベストアンサー1

一般的な方法は次のとおりです。

enum Foo {
  One,
  Two,
  Three,
  Last
};

for ( int fooInt = One; fooInt != Last; fooInt++ )
{
   Foo foo = static_cast<Foo>(fooInt);
   // ...
}

列挙型はLast反復処理によってスキップされることを意図していることに注意してください。この「偽の」Last列挙型を使用すると、新しい列挙型を追加するたびに、for ループの終了条件を最後の「実際の」列挙型に更新する必要がなくなります。後でさらに列挙型を追加する場合は、Last の前に追加します。この例のループは引き続き機能します。

もちろん、列挙値が指定されている場合は、これは機能しません。

enum Foo {
  One = 1,
  Two = 9,
  Three = 4,
  Last
};

これは、enum が実際には反復処理を目的としていないことを示しています。enum を扱う一般的な方法は、switch ステートメントで使用することです。

switch ( foo )
{
    case One:
        // ..
        break;
    case Two:  // intentional fall-through
    case Three:
        // ..
        break;
    case Four:
        // ..
        break;
     default:
        assert( ! "Invalid Foo enum value" );
        break;
}

本当に列挙したい場合は、列挙値をベクトルに詰め込み、それを反復処理します。これにより、指定された列挙値も適切に処理されます。

おすすめ記事