enum Foo {
One,
Two,
Three,
Last
};
for ( int fooInt = One; fooInt != Last; fooInt++ )
{
Foo foo = static_cast(fooInt);
// ...
}
注意していただきたいのは、列挙された Last は、反復処理でスキップされることを意味しているということです。この Last という偽の列挙体を利用すれば、新しい列挙体を追加するたびに、forループの終了条件を最後の Last という本当の列挙体に更新する必要はありません。
後から追加したい場合は、Lastの前に追加するだけです。この例のループはまだ動作します。
代表的な方法は以下の通りです。
注意していただきたいのは、列挙された
Last
は、反復処理でスキップされることを意味しているということです。このLast
という偽の列挙体を利用すれば、新しい列挙体を追加するたびに、forループの終了条件を最後のLast
という本当の列挙体に更新する必要はありません。 後から追加したい場合は、Lastの前に追加するだけです。この例のループはまだ動作します。もちろん、enumの値が指定されている場合は破綻します。
これは、列挙型は実際には反復処理を行うものではないことを示しています。enumを扱う典型的な方法はswitch文で使用することです。
本当に列挙したいのであれば、enumの値をベクターに入れてそれを反復処理します。これにより、指定されたenumの値も適切に処理されます。
enumではできません。 もしかしたら、enumはあなたの状況に最適ではないかもしれません。
一般的な慣習としては、最後のenum値をMAXのような名前にして、それを使ってintを使ったループを制御することがあります。
C++にはイントロスペクションがありませんので、このようなことをランタイムで判断することはできません。