Максимальне та мінімальне значення в переліку C ++


83

Чи є спосіб знайти максимальні та мінімально визначені значення переліку в c ++?


Погляньте на github.com/Neargye/magic_enum lib
dalle

1
Однією з причин, чому я міг би хотіти знати максимальне значення перерахування, не додаючи його до самого перерахування, є те, що мій компілятор не скаржиться (C4061), коли мій оператор 'switch' явно не обробляє значення "max value".
snips-n-

Відповіді:


96

Ні, немає можливості знайти максимальні та мінімально визначені значення будь-якого переліку в C ++. Коли потрібна така інформація, часто є гарною практикою визначати останнє та перше значення. Наприклад,

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

Для кожного значення між Firstі не потрібно називати значення Last.


3
Все ще корисний для непослідовних перерахувань - доки ви не очікуєте існування кожного значення
Адріан Корніш,

@ Адріан: Так, це правда. Вам не потрібно, щоб кожне значення мало певне ім’я, щоб ця техніка була корисною. Я відредагую відповідно
Джефф Йейтс,

гаразд, але ви повинні підтримувати його значення, якщо додавати нові.
Метт,

30

Ні, не в стандартній C ++. Ви можете зробити це вручну:

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values буде містити кількість значень у переліку.


num_values ​​буде містити цифри-1 значень
4pie0

12
@lizusek: num_valuesміститиме кількість значень у переліченні, крім num_valuesсебе.
dalle

3
@dalie так, саме тому це буде: кількість значень - 1. Звичайно, я знаю, що ви маєте на увазі значення, що означають значення без урахування останнього, яке не є реальною величиною, а допоміжним. Однак я б запропонував зробити це більш чітким.
4pie0

1
@dalle Тільки якщо val0 = 0
user2470258

@ user2470258, як визначено вище, завжди 0
dalle

6

Ні. Перелік у C або C ++ - це просто перелік констант. Не існує вищої структури, яка містила б таку інформацію.

Зазвичай, коли мені потрібна така інформація, я включаю до переліку значення max і min приблизно так:

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

Деякі приклади того, як це може бути корисним, див. Цю веб-сторінку: Stupid Enum Tricks


стаття, на яку ви посилаєтеся, з часів, коли компілятор авторів "не підтримує новий офіційний булевий тип C ++" .... Я ніколи раніше не читав чогось такого старовинного: P.
greatest_prime_is_463035818

4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

після визначення My_enum :: LAST_VALUE == N + 1


-1

Не автоматично, але ви можете додавати штучні значення перерахування для позначення мінімальних та максимальних значень, наприклад

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++) {
.... 
}

1
розгляньте можливість додати опис, який допоможе відповісти.
Бібберті

-5

вони вам навіть не потрібні, що я роблю, це просто кажу, наприклад, якщо у вас є:

enum Name{val0,val1,val2};

якщо у вас є оператор switch і для перевірки, чи досягнуто останнього значення, зробіть наступне:

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}

16
Це дуже крихке рішення. Якщо ви додасте нове значення перерахування, вам доведеться обстежити всю базу коду, щоб оновити такі тести.
Марсело Кантос,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.