enum class
フィールドを基になるタイプに変換する方法はありますか?これは自動だと思いましたが、どうやらそうではありません。
enum class my_fields : unsigned { field = 1 };
unsigned a = my_fields::field;
その割り当てはGCCによって拒否されています。error: cannot convert 'my_fields' to 'unsigned int' in assignment
。
std::underlying_typeを使用して基になる型を知り、キャストを使用できると思います。
#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 class my_fields : unsigned { field = 1 };
// ...
unsigned x = my_fields::field; // ERROR!
unsigned x = static_cast<unsigned>(my_fields::field); // OK
また、セミコロンは、列挙型の定義の閉じた中括弧の前ではなく、後にある必要があるという事実にも注意してください。