Acho que você pode usar std :: subjacente_type para saber o tipo subjacente e, em seguida, usar cast:
#include <type_traits> //for std::underlying_type
typedef std::underlying_type<my_fields>::type utype;
utype a = static_cast<utype>(my_fields::field);
Com isso, você não precisa assumir o tipo subjacente, ou não precisa mencioná-lo na definição de algo enum class
semelhante enum class my_fields : int { .... }
.
Você pode até escrever uma função de conversão genérica que deve ser capaz de converter qualquer um enum class
em seu tipo integral subjacente :
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);
}
então use-o:
auto value = to_integral(my_fields::field);
auto redValue = to_integral(Color::Red);//where Color is an enum class!
E como a função é declarada como sendo constexpr
, você pode usá-la onde a expressão constante é necessária:
int a[to_integral(my_fields::field)]; //declaring an array
std::array<int, to_integral(my_fields::field)> b; //better!
enum
.