Wartości maksymalne i minimalne w wyliczeniu w języku C ++

83

Czy istnieje sposób na znalezienie maksymalnej i minimalnej zdefiniowanej wartości wyliczenia w języku C ++?

Matt
źródło
Spójrz na github.com/Neargye/magic_enum lib
dalle
1
Jednym z powodów, dla których mógłbym chcieć poznać maksymalną wartość wyliczenia bez dodawania jej do samego wyliczenia, jest to, że mój kompilator nie narzeka (C4061), gdy moja instrukcja „switch” nie obsługuje jawnie wartości „max value”.
snips-n-snails

Odpowiedzi:

96

Nie, nie ma sposobu, aby znaleźć maksymalne i minimalne zdefiniowane wartości dowolnego wyliczenia w C ++. Kiedy tego rodzaju informacje są potrzebne, często dobrą praktyką jest zdefiniowanie wartości Last i First. Na przykład,

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

Nie ma potrzeby nadawania nazw wartościom dla każdej wartości z przedziału od Firstdo Last.

Jeff Yates
źródło
3
Nadal przydatne do niesekwencyjnych wyliczeń - o ile nie spodziewasz się istnienia każdej wartości
Adrian Cornish,
@Adrian: Tak, to prawda. Nie potrzebujesz każdej wartości, aby mieć zdefiniowaną nazwę, aby ta technika była użyteczna. Zmienię odpowiednio
Jeff Yates,
ok, ale musisz zachować jego wartość, jeśli zostaną dodane nowe.
Matt
30

Nie, nie w standardowym C ++. Możesz to zrobić ręcznie:

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

num_values będzie zawierać liczbę wartości w wyliczeniu.

dalle
źródło
num_values ​​będzie zawierać liczby-1 wartości
4pie0
12
@lizusek: num_valuesbędzie zawierał liczbę wartości w wyliczeniu, z wyjątkiem num_valuessiebie.
dalle
3
@dalie tak, dlatego będzie to: liczba wartości - 1. Oczywiście wiem, że masz na myśli wartości, które oznaczają wartości wykluczające ostatnią, która nie jest wartością rzeczywistą, ale pomocnikiem. Sugerowałbym jednak, aby było to jaśniejsze.
4pie0
1
@dalle Tylko jeśli val0 = 0
user2470258
@ user2470258, jak zdefiniowano powyżej, zawsze wynosi 0.
dalle
6

Nie. Wyliczenie w C lub C ++ to po prostu lista stałych. Nie ma wyższej struktury, która przechowała takie informacje.

Zwykle, gdy potrzebuję tego rodzaju informacji, dołączam do wyliczenia wartości maksymalne i minimalne, mniej więcej tak:

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

Zobacz tę stronę internetową, aby zobaczyć kilka przykładów tego, jak to może być przydatne: Stupid Enum Tricks

Justsalt
źródło
artykuł, do którego odsyłasz, pochodzi z czasów, w których kompilator autorów „nie obsługuje nowego oficjalnego typu boolowskiego C ++” .... Nigdy wcześniej nie czytałem czegoś tak starożytnego: P.
largest_prime_is_463035818
4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

po definicji My_enum :: LAST_VALUE == N + 1

Tiendil
źródło
-1

Nie automatycznie, ale możesz dodać sztuczne wartości wyliczenia, aby oznaczyć wartości minimalne i maksymalne, np

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++) {
.... 
}
wannes
źródło
1
rozważ dodanie opisu, aby pomóc w udzieleniu odpowiedzi.
Bibberty
-5

nawet ich nie potrzebujesz, ja tylko mówię, jeśli masz na przykład:

enum Name{val0,val1,val2};

jeśli masz instrukcję switch i aby sprawdzić, czy ostatnia wartość została osiągnięta, wykonaj następujące czynności:

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

   //code
}
Wael
źródło
16
To bardzo delikatne rozwiązanie. Jeśli dodasz nową wartość wyliczenia, musisz zbadać całą bazę kodu, aby zaktualizować takie testy.
Marcelo Cantos