wake-up-neo.com

Fortlaufende Aufzählung C ++ 11

Gibt es eine Möglichkeit, in C++ 11 zu überprüfen, ob eine Aufzählung kontinuierlich ist?

Es ist voll gültig, eine Aufzählung anzugeben, die nicht sind. Gibt es möglicherweise eine Funktion wie ein Typmerkmal in C++ 14, C++ 17 oder C++ 20, um zu überprüfen, ob die Aufzählung fortlaufend ist? Dies soll in einem static_assert verwendet werden.

Es folgt ein kleines Beispiel:

enum class Types_Discontinuous {
  A = 10,
  B = 1,
  C = 100
};

enum class Types_Continuous {
  A = 0,
  B = 1,
  C = 2
};

static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails
static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be continuous");    // Passes
17
Bart

Alle Aufzählungen sind fortlaufend. 0 ist immer erlaubt; Der höchste zulässige Wert ist der höchste auf den nächsten 1<<N -1 aufgerundete Enumerator (alle Bits eins), und alle dazwischen liegenden Werte sind ebenfalls zulässig. ([dcl.enum] 9.7.1/5). Wenn negative Enumeratoren definiert sind, wird der niedrigste zulässige Wert auf ähnliche Weise definiert, indem der niedrigste Enumerator abgerundet wird.

Die in enum definierten Enumeratoren sind konstante Ausdrücke mit einem Wert im Bereich und dem richtigen Typ. Sie können jedoch zusätzliche Konstanten außerhalb von enum definieren, die dieselben Eigenschaften haben:

constexpr enum class Types_Discontinuous = static_cast<Types_Discontinuous>(2)

1
MSalters

Ich würde gerne eine Antwort darauf sehen. Ich habe es auch gebraucht.

Leider glaube ich nicht, dass dies mit den vorhandenen Dienstprogrammen möglich ist. Wenn Sie hierfür ein Typmerkmal implementieren möchten, benötigen Sie Unterstützung von Ihrem Compiler, sodass das Schreiben einer Vorlage dafür nicht machbar klingt.

Ich habe die Aufzählung bereits um ein bestimmtes Tag erweitert, um anzuzeigen, dass sie zusammenhängend ist, und gibt Ihnen sofort die Größe: Enum-Klassenkonstruktor c ++, wie wird ein bestimmter Wert übergeben?

Alternativ können Sie Ihr eigenes Merkmal schreiben:

 template<T> struct IsContiguous : std::false_type {};

Dies muss immer dann spezialisiert werden, wenn Sie eine zusammenhängende Aufzählung definieren, in der Sie diese verwenden möchten. Leider erfordert dies einige Wartung und Aufmerksamkeit, wenn die Aufzählung geändert wird.

1
JVApen