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.