117 votes

Une classe enum peut-elle être convertie en type sous-jacent?

Existe-t-il un moyen de convertir un champ enum class en type sous-jacent? Je pensais que cela serait automatique, mais apparemment pas.

 enum class my_fields : unsigned { field = 1 };

unsigned a = my_fields::field;
 

Cette cession est rejetée par GCC. error: cannot convert 'my_fields' to 'unsigned int' in assignment .

189voto

Nawaz Points 148870

Je pense que vous pouvez utiliser std::underlying_type pour connaître le type sous-jacent, et ensuite utiliser cast:

#include <type_traits> //for std::underlying_type

typedef std::underlying_type<my_fields>::type utype;

utype a = static_cast<utype>(my_fields::field);

Avec cela, vous n'avez pas à assumer le type sous-jacent, ou vous n'avez pas à le mentionner dans la définition de l' enum class comme enum class my_fields : int { .... } .

Vous pouvez même écrire un générique de la fonction de conversion qui devrait être en mesure de convertir tout enum class de son sous-jacent partie intégrante de type:

template<typename E>
constexpr auto to_integral(E e) -> typename std::underlying_type<E>::type 
{
   return static_cast<typename std::underlying_type<E>::type>(e);
}

ensuite l'utiliser:

auto value = to_integral(my_fields::field);

auto redValue = to_integral(Color::Red);//where Color is an enum class!

Et puisque la fonction est déclarée constexpr, vous pouvez l'utiliser lorsque l'expression constante est nécessaire:

int a[to_integral(my_fields::field)]; //declaring an array

std::array<int, to_integral(my_fields::field)> b; //better!

Espérons que cela aide.

44voto

Andy Prowl Points 62121

Vous ne pouvez pas le convertir implicitement , mais une conversion explicite est possible:

 enum class my_fields : unsigned { field = 1 };

// ...

unsigned x = my_fields::field; // ERROR!
unsigned x = static_cast<unsigned>(my_fields::field); // OK
 

Remarquez également que le point-virgule doit être placé après l'accolade fermée dans la définition de votre enum, pas avant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X