今気づいたのですが、列挙型では標準的な数学演算子(++や+=など)は使えません。
では、C++のenumに含まれるすべての値を繰り返し処理するには、どのような方法があるのでしょうか?
代表的な方法は以下の通りです。
enum Foo {
One,
Two,
Three,
Last
};
for ( int fooInt = One; fooInt != Last; fooInt++ )
{
Foo foo = static_cast<Foo>(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の値も適切に処理されます。