Есть ли способ найти максимальное и минимальное определенные значения перечисления в с ++?
Одна из причин, по которой я мог бы захотеть узнать максимальное значение перечисления, не добавляя его в само перечисление, заключается в том, что мой компилятор не жалуется (C4061), когда мой оператор 'switch' не обрабатывает явно значение «максимального значения».





Нет, нет способа найти максимальное и минимальное определенные значения любого перечисления в C++. Когда требуется такая информация, часто рекомендуется определить значения Last и First. Например,
enum MyPretendEnum
{
Apples,
Oranges,
Pears,
Bananas,
First = Apples,
Last = Bananas
};
Необязательно указывать значения для каждого значения от First до Last.
По-прежнему полезно для непоследовательных перечислений - если вы не ожидаете, что каждое значение существует
@ Адриан: Да, это правда. Необязательно, чтобы у каждого значения было определенное имя, чтобы этот метод был полезен. Я отредактирую соответственно
хорошо, но вы должны поддерживать его ценность, если добавляются новые.
Нет, не в стандартном C++. Вы можете сделать это вручную:
enum Name
{
val0,
val1,
val2,
num_values
};
num_values будет содержать количество значений в перечислении.
num_values будет содержать числа-1 значений
@lizusek: num_values будет содержать количество значений в перечислении, кроме самого num_values.
@dalie да, вот почему это будет: количество значений - 1. Конечно, я знаю, что вы имеете в виду значения, которые означают значения, исключая последнее, которое не является реальным значением, а является вспомогательным. Однако я бы посоветовал сделать это более понятным.
@dalle Только если val0 = 0
@ user2470258, как определено выше, всегда 0.
Я предпочитаю этот подход другим, так как нет необходимости обновлять его значение при добавлении новых, если он последний в списке.
Нет. Перечисление в C или C++ - это просто список констант. Нет более высокой структуры, которая могла бы хранить такую информацию.
Обычно, когда мне нужна такая информация, я включаю в перечисление максимальное и минимальное значение примерно так:
enum {
eAaa = 1,
eBbb,
eCccc,
eMin = eAaaa,
eMax = eCccc
}
См. На этой веб-странице несколько примеров того, как это может быть полезно: Глупые трюки с Enum
статья, на которую вы ссылаетесь, относится к тому времени, когда авторский компилятор "не поддерживает новый официальный логический тип C++" .... Я никогда раньше не читал что-то настолько древнее: P.
enum My_enum
{
FIRST_VALUE = 0,
MY_VALUE1,
MY_VALUE2,
...
MY_VALUEN,
LAST_VALUE
};
после определения My_enum :: LAST_VALUE == N + 1
они вам даже не нужны, я просто говорю, например, если у вас есть:
enum Name{val0,val1,val2};
если у вас есть оператор switch, и чтобы проверить, было ли достигнуто последнее значение, выполните следующие действия:
if (selectedOption>=val0 && selectedOption<=val2){
//code
}
Это очень хрупкое решение. Если вы добавляете новое значение перечисления, вам необходимо изучить всю базу кода, чтобы обновить такие тесты.
Не автоматически, но вы можете добавить искусственные значения перечисления для обозначения минимальных и максимальных значений, например
typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;
for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
....
}
подумайте о добавлении описания, чтобы помочь с ответом.
Взгляните на библиотеку github.com/Neargye/magic_enum