Как я могу выполнить итерации по перечислению?

282
задан Lightness Races with Monica 20 June 2013 в 23:04
поделиться

6 ответов

Типичный путь следующие:

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

, Если Вы действительно хотите перечислить, наполните перечислимые значения в векторе и выполните итерации по этому. Это будет правильно иметь дело с указанными перечислимыми значениями также.

247
ответ дан David Tóth 23 November 2019 в 01:56
поделиться

C++ не имеет самоанализа, таким образом, Вы не можете определить такого рода вещь во времени выполнения.

0
ответ дан David Kemp 23 November 2019 в 01:56
поделиться

Можно также перегрузить инкремент/операторы понижения для перечислимого типа.

3
ответ дан JohnMcG 23 November 2019 в 01:56
поделиться

Вы не можете с перечислением. Возможно, перечисление не является лучшим пригодным для Вашей ситуации.

А общее соглашение состоит в том, чтобы назвать последнее перечисление значений чем-то как МАКС и использовать это для управления циклом с помощью интервала

8
ответ дан Corey Trager 23 November 2019 в 01:56
поделиться

Если Ваше перечисление запускается с 0, и инкремент всегда равняется 1.

enum enumType 
{ 
    A = 0,
    B,
    C,
    enumTypeEnd
};

for(int i=0; i<enumTypeEnd; i++)
{
   enumType eCurrent = (enumType) i;            
}

, Если не я предполагаю единственное, почему должен создать что-то как

vector<enumType> vEnums;

, добавляют объекты и используют нормальные итераторы....

18
ответ дан João Augusto 23 November 2019 в 01:56
поделиться

В книге языка программирования на 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, так как они сильны введенный и могут предотвратить нас, чтобы сделать ошибку во время компиляции.

1
ответ дан 23 November 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: