3 Stimmen

Den höchsten Wert eines Enums erhalten

Ich habe C++-Code, der ein Bitset verwendet, um zu speichern, welche Werte eines Enums in meinen Datenstrukturen gefunden wurden (es ist eigentlich etwas komplexer, aber das spielt für die Frage keine Rolle).

Dies bedeutet, dass wenn ich ein Enum so habe:

enum Color
   {
     RED
   , GREEN
   , BLUE
   };

Möchte ich mein Bitset so definieren:

std::bitset<3>

Natürlich möchte ich den Wert 3 nicht fest codieren.

In einigen Fällen kann ich einfach einen "Terminator" zum Enum hinzufügen, so wie hier:

enum Color
   {
     RED
   , GREEN
   , BLUE
   , _COLOR_TERMINATOR
   };

Und ich kann dies schreiben:

std::bitset<_COLOR_TERMINATOR>

Aber das kann ich nicht bei allen meinen Enums tun. Wenn ich dies bei einigen meiner Enums machen würde, würden Code-Checker (wie Lint) sich beschweren, dass nicht alle Enum-Werte in einer switch-Anweisung verwendet werden.

Gibt es eine Möglichkeit, das Maximum der Werte in einem Enum zu erhalten, ohne etwas im Enum selbst zu ändern? Zum Beispiel etwas wie std::max?

Verwende Visual Studio 2013 und C++.

Danke.

2voto

Qassim Punkte 96

Vielleicht könnten Sie ein Trait verwenden, das speziell für Ihre Enums entwickelt wurde, um den maximal definierten Wert hinzuzufügen

template struct top_bound;
template<> struct top_bound{ static const size_t value = 3;};

und dann

std::bitset::value> my_bitset;

Sie müssen das Trait immer noch ändern, wenn sich das Enum ändert, aber Sie haben nur eine explizite Stelle, an der Sie es tun müssen.

0voto

David K Punkte 3109

Wenn Sie das Folgende schreiben, beschwert sich Ihre Version von lint?

enum Color
 {
   RED
 , GREEN
 , BLUE
 , LAST_COLOR = BLUE
 };

Diese Definition von LAST_COLOR ist relativ einfach zu pflegen (Sie müssen sie nur ändern, wenn Sie am Ende eine Farbe hinzufügen oder entfernen, nicht wenn Sie Farben an anderen Stellen einfügen oder entfernen, und wenn das Einfügen oder Löschen einer Farbe dazu führt, dass Sie zwei Zeilen ändern müssen, sind es zumindest aufeinanderfolgende Zeilen Ihres Codes). So können Sie beispielsweise schreiben,

std::bitset

Alternativ, unmittelbar nach der Definition von enum Color, wie wäre es mit

static const size_t _COLOR_TERMINATOR = BLUE + 1;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X