Existe-t-il un moyen de convertir un enum class
champ en type sous-jacent? Je pensais que ce serait automatique, mais apparemment pas.
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
Cette affectation est rejetée par GCC. error: cannot convert 'my_fields' to 'unsigned int' in assignment
.
enum
.[C++11: 7.2/9]
.Réponses:
Je pense que vous pouvez utiliser std :: sous-jacent_type pour connaître le type sous-jacent, puis utiliser cast:
Avec cela, vous n'avez pas à assumer le type sous-jacent, ou vous n'avez pas à le mentionner dans la définition de quelque chose de
enum class
similaireenum class my_fields : int { .... }
.Vous pouvez même écrire une fonction de conversion générique qui devrait être capable de convertir n'importe quelle fonction
enum class
en son type intégral sous-jacent :puis utilisez-le:
Et puisque la fonction est déclarée être
constexpr
, vous pouvez l'utiliser là où une expression constante est requise:la source
template <typename T> auto to_integral(T e) { return static_cast<std::underlying_type_t<T>>(e); }
constexpr
aussi dans le futur; en fait beaucoup plus puissant que ce que j'avais en 2013: P)Vous ne pouvez pas le convertir implicitement , mais un cast explicite est possible:
Gardez également à l'esprit que le point-virgule doit être après l'accolade fermée dans la définition de votre énumération, pas avant.
la source
Je trouve la fonction suivante
underlying_cast
utile lorsque je dois sérialiser correctement les valeurs d'énumération.la source
Comme d'autres l'ont souligné, il n'y a pas de conversion implicite, mais vous pouvez utiliser un fichier explicite
static_cast
. J'utilise les fonctions d'assistance suivantes dans mon code pour convertir vers et depuis un type enum et sa classe sous-jacente.Code d'utilisation
la source