Tôi nghĩ bạn có thể sử dụng std :: underlying_type để biết loại cơ bản và sau đó sử dụng ép kiểu:
#include <type_traits> //for std::underlying_type
typedef std::underlying_type<my_fields>::type utype;
utype a = static_cast<utype>(my_fields::field);
Với điều này, bạn không phải giả định loại cơ bản hoặc bạn không cần phải đề cập đến nó trong định nghĩa của loại enum class
tương tự enum class my_fields : int { .... }
.
Bạn thậm chí có thể viết một hàm chuyển đổi chung có thể chuyển đổi bất kỳ enum class
thành kiểu tích phân cơ bản của nó :
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);
}
sau đó sử dụng nó:
auto value = to_integral(my_fields::field);
auto redValue = to_integral(Color::Red);//where Color is an enum class!
Và vì hàm được khai báo là constexpr
, bạn có thể sử dụng nó khi cần có biểu thức hằng số:
int a[to_integral(my_fields::field)]; //declaring an array
std::array<int, to_integral(my_fields::field)> b; //better!
enum
.