1. ホーム
  2. c++

[解決済み】enumを繰り返し処理する方法は?

2022-03-25 19:44:38

質問

今気づいたのですが、enum に対して ++ や += のような標準的な数学演算子は使えません。

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

どのように解決するのですか?

代表的な方法は以下の通りです。

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

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

なお、enum Last は反復処理でスキップされることを意味します。この "fake" を利用する。 Last enum を追加するたびに、for ループの終了条件を最後の "real" enum に更新する必要がありません。 もし、後でさらに列挙型を追加したい場合は、Last の前に追加すればよいだけです。この例では、ループはまだ動作します。

もちろん、enumの値が指定されている場合は、これが崩れる。

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;
}

どうしても列挙したい場合は、enumの値をvectorに詰め込んで、それを反復処理します。そうすれば、指定されたenum値も適切に処理される。