enumを反復するにはどうしたらいいですか?

今気づいたのですが、列挙型では標準的な数学演算子(++や+=など)は使えません。

では、C++のenumに含まれるすべての値を繰り返し処理するには、どのような方法があるのでしょうか?

ソリューション

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

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

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

注意していただきたいのは、列挙された Last は、反復処理でスキップされることを意味しているということです。この Last という偽の列挙体を利用すれば、新しい列挙体を追加するたびに、forループの終了条件を最後の Last という本当の列挙体に更新する必要はありません。 後から追加したい場合は、Lastの前に追加するだけです。この例のループはまだ動作します。

もちろん、enumの値が指定されている場合は破綻します。

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

これは、列挙型は実際には反復処理を行うものではないことを示しています。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の値をベクターに入れてそれを反復処理します。これにより、指定されたenumの値も適切に処理されます。

解説 (8)

enumではできません。 もしかしたら、enumはあなたの状況に最適ではないかもしれません。

一般的な慣習としては、最後のenum値をMAXのような名前にして、それを使ってintを使ったループを制御することがあります。

解説 (0)

C++にはイントロスペクションがありませんので、このようなことをランタイムで判断することはできません。

解説 (7)