1. ホーム
  2. c++

[解決済み] enum クラスは基礎となる型に変換できますか?

2022-05-13 17:33:38

質問

を変換する方法はありますか? 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!