1. ホーム
  2. c++

[解決済み] C++11でenumクラスの値を出力するには?

2022-08-22 01:51:59

質問

の値を出力するにはどうしたらよいでしょうか? enum class の値を出力するにはどうしたらよいでしょうか。C++03ではこんな感じです。

#include <iostream>

using namespace std;

enum A {
  a = 1,
  b = 69,
  c= 666
};

int main () {
  A a = A::c;
  cout << a << endl;
}

c++0xでは、このコードはコンパイルできません。

#include <iostream>

using namespace std;

enum class A {
  a = 1,
  b = 69,
  c= 666
};

int main () {
  A a = A::c;
  cout << a << endl;
}


prog.cpp:13:11: error: cannot bind 'std::ostream' lvalue to 'std::basic_ostream<char>&&'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/ostream:579:5: error:   initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = A]'

でコンパイルされた イデオン・ドットコム

どのように解決するのですか?

スコープされていない列挙と異なり、スコープされた列挙は 暗黙のうちに で整数値に変換されます。 そのため 明示的に キャストを用いて整数に変換する必要があります。

std::cout << static_cast<std::underlying_type<A>::type>(a) << std::endl;

ロジックを関数テンプレートにカプセル化するのもよいでしょう。

template <typename Enumeration>
auto as_integer(Enumeration const value)
    -> typename std::underlying_type<Enumeration>::type
{
    return static_cast<typename std::underlying_type<Enumeration>::type>(value);
}

として使われる。

std::cout << as_integer(a) << std::endl;