Типичный путь следующие:
enum Foo {
One,
Two,
Three,
Last
};
for ( int fooInt = One; fooInt != Last; fooInt++ )
{
Foo foo = static_cast<Foo>(fooInt);
// ...
}
, Конечно, это ломается, если перечислимые значения определяются:
enum Foo {
One = 1,
Two = 9,
Three = 4,
Last
};
Это иллюстрирует, что перечисление действительно не предназначено для итерации через. Типичный способ иметь дело с перечислением состоит в том, чтобы использовать его в операторе переключения.
switch ( foo )
{
case One:
// ..
break;
case Two: // intentional fall-through
case Three:
// ..
break;
case Four:
// ..
break;
default:
assert( ! "Invalid Foo enum value" );
break;
}
, Если Вы действительно хотите перечислить, наполните перечислимые значения в векторе и выполните итерации по этому. Это будет правильно иметь дело с указанными перечислимыми значениями также.
C++ не имеет самоанализа, таким образом, Вы не можете определить такого рода вещь во времени выполнения.
Можно также перегрузить инкремент/операторы понижения для перечислимого типа.
Вы не можете с перечислением. Возможно, перечисление не является лучшим пригодным для Вашей ситуации.
А общее соглашение состоит в том, чтобы назвать последнее перечисление значений чем-то как МАКС и использовать это для управления циклом с помощью интервала
Если Ваше перечисление запускается с 0, и инкремент всегда равняется 1.
enum enumType
{
A = 0,
B,
C,
enumTypeEnd
};
for(int i=0; i<enumTypeEnd; i++)
{
enumType eCurrent = (enumType) i;
}
, Если не я предполагаю единственное, почему должен создать что-то как
vector<enumType> vEnums;
, добавляют объекты и используют нормальные итераторы....
В книге языка программирования на C++ Bjarne Stroustrup можно считать, что он предлагает перегрузиться operator++
для определенного enum
. enum
пользовательские типы, и перегружающийся оператор существует на языке для этих определенных ситуаций.
Вы сможете кодировать следующее:
#include <iostream>
enum class Colors{red, green, blue};
Colors& operator++(Colors &c, int)
{
switch(c)
{
case Colors::red:
return c=Colors::green;
case Colors::green:
return c=Colors::blue;
case Colors::blue:
return c=Colors::red; // managing overflow
default:
throw std::exception(); // or do anything else to manage the error...
}
}
int main()
{
Colors c = Colors::red;
// casting in int just for convenience of output.
std::cout << (int)c++ << std::endl;
std::cout << (int)c++ << std::endl;
std::cout << (int)c++ << std::endl;
std::cout << (int)c++ << std::endl;
std::cout << (int)c++ << std::endl;
return 0;
}
тестовый код: http://cpp.sh/357gb
Мышление, которое я использую enum class
. Код хорошо работает с enum
также. Но я предпочитаю enum class
, так как они сильны введенный и могут предотвратить нас, чтобы сделать ошибку во время компиляции.