118

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

4

5 に答える 5

192

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!
于 2013-01-29T18:16:10.973 に答える
44

暗黙的に変換することはできませんが、明示的なキャストは可能です:

enum class my_fields : unsigned { field = 1 };

// ...

unsigned x = my_fields::field; // ERROR!
unsigned x = static_cast<unsigned>(my_fields::field); // OK

また、セミコロンは、列挙型の定義の閉じた中括弧の前ではなく、後にある必要があるという事実にも注意してください。

于 2013-01-29T18:16:23.457 に答える