web-dev-qa-db-fra.com

Énumération continue C ++ 11

Existe-t-il un moyen de vérifier en C++ 11 si une énumération est continue ?

Il est tout à fait valide de donner des valeurs d'énumération qui ne le sont pas. Y a-t-il peut-être une fonctionnalité comme un trait de type dans C++ 14, C++ 17 ou peut-être C++ 20 pour vérifier si l'énumération est continue? Ceci à utiliser dans un static_assert.

Un petit exemple suit:

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

Tous les énumérations sont continues. 0 est toujours autorisé; la valeur la plus élevée autorisée est l'énumérateur le plus élevé arrondi au 1<<N -1 suivant (tous les bits un), et toutes les valeurs intermédiaires sont également autorisées. ([dcl.enum] 9.7.1/5). Si des énumérateurs négatifs sont définis, la valeur la plus basse autorisée est définie de la même manière en arrondissant l'énumérateur le plus bas.

Les énumérateurs définis dans le enum sont des expressions constantes avec une valeur dans la plage et le type correct, mais vous pouvez définir des constantes supplémentaires en dehors de enum qui ont les mêmes propriétés:

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

1
MSalters