Перебирать Enums в C ++ - PullRequest
       4

Перебирать Enums в C ++

0 голосов
/ 04 сентября 2010

C ++ enum вопрос.

Итак, у меня есть список файлов и их идентификаторы, которые мне нужно перебрать, и сделать что-то для этого.Большинство вещей одинаковы, но есть несколько вещей, которые нужно выполнить для конкретного файла.Я попытался поместить идентификаторы файлов в перечисление и повторить это.Как бы то ни было, идентификаторы файлов не являются смежными и прыгают.

В настоящее время у меня есть что-то похожее на это

for(int i = 0; i < FILE_ENUM_MAX; i++)
{
    currentFile = myEnum(i);
    // do stuff
}

enum myEnum {
    file1 = 0x1111,
    file2 = 0x8000,
    file3 = 0x75,
    file4 = 0x120,
    FILE_ENUM_MAX = 4
}

Это не работает;Я просто просматриваю файлы 0, 1, 2 и 3. Я понимаю, что не могу просто получить N-й элемент в перечислении, запрашивая элемент N. Так, как лучше всего перебрать это перечисление?Или я должен просто избавиться от этого?Я, вероятно, мог бы расположить элементы в числовом порядке, но я бы предпочел решение, где порядок не имеет значения.

Ответы [ 5 ]

4 голосов
/ 04 сентября 2010

Я полагаю, что не требующий высоких технологий ответ может состоять в том, чтобы пропустить перечисление и просто создать статический массив:

#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))

int FILE_ENUM[] = { 0x1111, 0x8000, 0x75, 0x120 };

for(int i = 0; i < ARRAYSIZE(FILE_ENUM); i++) {
    currentFile = myEnum[i];
    // do stuff
}

TJ

4 голосов
/ 04 сентября 2010

К сожалению, C ++ не предоставляет способ перебирать перечисления так, как вы хотите.

1 голос
/ 04 сентября 2010

У меня есть два предложения:

  1. Используйте std::vector для хранения перечислений.
  2. Используйте std::map для хранения перечислений.

Решение 2 предлагает преимущество, когда ключ является идентификатором файла, а значение может быть именем файла (или объектом, содержащим атрибуты файла, таким как файл).ручка или указатель).

0 голосов
/ 09 мая 2017

Наверное, лучший ответ: зачем вам это нужно / не нужно?

Либо используйте массив или список, либо что-то, что вы можете легко перебрать.

Если вам нужно, чтобы он был неизменным, выберите ReadOnlyCollection или ImmutableArray

Теперь, чтобы ответить на вопрос - Взгляните на это: -> fiddle diddle Мало того, что он перебирает значения корыто, он отображает имена и лежащие в их основе числа.И это показывает, что вы можете иметь один и тот же номер для разных имен в перечислении.

Или, может быть, вы думали так:

public static IEnumerable<T> GetValues<T>() {
    return (T[])Enum.GetValues(typeof(T))
}

Если я прав, я выбрал этот хороший трюк из - https://stackoverflow.com/a/972323/5439782

0 голосов
/ 23 марта 2013

i <= FILE_ENUM_MAX, и он будет повторяться с 4-м файлом. Извините, если это старая ветка, но, возможно, кому-то все еще понадобится ответ, чтобы найти его здесь. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...