Max- und Min-Werte in einer C ++ - Aufzählung


82

Gibt es eine Möglichkeit, die maximal und minimal definierten Werte einer Aufzählung in c ++ zu finden?


Werfen Sie einen Blick auf die github.com/Neargye/magic_enum lib
dalle

1
Ein Grund, warum ich den Maximalwert einer Aufzählung wissen möchte, ohne ihn zur Aufzählung selbst hinzuzufügen, ist, dass sich mein Compiler nicht beschwert (C4061), wenn meine Anweisung 'switch' den Wert "Maximalwert" nicht explizit verarbeitet.
Snips-n-

Antworten:


95

Nein, es gibt keine Möglichkeit, die maximal und minimal definierten Werte einer Aufzählung in C ++ zu finden. Wenn diese Art von Informationen benötigt wird, empfiehlt es sich häufig, einen letzten und einen ersten Wert zu definieren. Zum Beispiel,

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

Es müssen nicht für jeden Wert zwischen Firstund benannte Werte angegeben werden Last.


3
Immer noch nützlich für nicht-sequentielle Aufzählungen - solange Sie nicht erwarten, dass jeder Wert existiert
Adrian Cornish

@Adrian: Ja, das ist wahr. Sie müssen nicht für jeden Wert einen definierten Namen haben, damit diese Technik nützlich ist. Ich werde entsprechend bearbeiten
Jeff Yates

ok, aber du musst seinen Wert beibehalten, wenn neue hinzugefügt werden.
Matt

30

Nein, nicht in Standard C ++. Sie können es manuell tun:

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

num_values enthält die Anzahl der Werte in der Aufzählung.


num_values ​​enthält die Zahlen-1 der Werte
4pie0

12
@lizusek: Enthält num_valuesdie Anzahl der Werte in der Aufzählung, außer sich num_valuesselbst.
dalle

3
@dalie ja, deshalb wird es sein: Anzahl der Werte - 1. Natürlich weiß ich, dass Sie einen Wert meinen, der Werte ohne den letzten bedeutet, der kein realer Wert, sondern ein Helfer ist. Ich würde jedoch vorschlagen, es klarer zu machen.
4pie0

1
@dalle Nur wenn val0 = 0
user2470258

@ user2470258 wie oben definiert ist es immer 0.
dalle

6

Nein. Eine Aufzählung in C oder C ++ ist einfach eine Liste von Konstanten. Es gibt keine höhere Struktur, die solche Informationen enthalten würde.

Wenn ich diese Art von Informationen benötige, füge ich normalerweise einen Max- und Min-Wert wie folgt in die Aufzählung ein:

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

Auf dieser Webseite finden Sie einige Beispiele, wie dies nützlich sein kann: Dumme Aufzählungstricks


Der Artikel, den Sie verlinken, stammt aus einer Zeit, in der der Autoren-Compiler "den neuen offiziellen C ++ - Booleschen Typ nicht unterstützt". Ich habe noch nie etwas so Altes gelesen: P.
größter_prime_is_463035818

4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

Nach der Definition ist My_enum :: LAST_VALUE == N + 1


-1

Nicht automatisch, aber Sie können künstliche Aufzählungswerte hinzufügen, um Min- und Max-Werte zu kennzeichnen, z

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
Fügen Sie möglicherweise eine Beschreibung hinzu, um die Antwort zu erleichtern.
Bibberty

-5

du brauchst sie nicht einmal, was ich tue, ist nur, dass ich zum Beispiel sage, wenn du hast:

enum Name{val0,val1,val2};

Wenn Sie eine switch-Anweisung haben und prüfen möchten, ob der letzte Wert erreicht wurde, gehen Sie wie folgt vor:

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

   //code
}

15
Dies ist eine sehr fragile Lösung. Wenn Sie einen neuen Aufzählungswert hinzufügen, müssen Sie Ihre gesamte Codebasis untersuchen, um solche Tests zu aktualisieren.
Marcelo Cantos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.