Я думаю, ви можете використовувати std :: underlying_type, щоб знати базовий тип, а потім використовувати cast:
#include <type_traits> //for std::underlying_type
typedef std::underlying_type<my_fields>::type utype;
utype a = static_cast<utype>(my_fields::field);
При цьому вам не потрібно вважати базовий тип, або вам не потрібно згадувати його у визначенні enum class
подібного enum class my_fields : int { .... }
чи іншого.
Ви навіть можете записати загальну функцію перетворення, яка повинна бути в змозі перетворити будь-яку enum class
в її основний інтегральний тип:
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);
}
потім використовуйте його:
auto value = to_integral(my_fields::field);
auto redValue = to_integral(Color::Red);//where Color is an enum class!
А оскільки функція оголошена такою constexpr
, ви можете використовувати її там, де потрібно постійне вираження:
int a[to_integral(my_fields::field)]; //declaring an array
std::array<int, to_integral(my_fields::field)> b; //better!
enum
.