最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::underlying_type(C++11)

namespace std {
  template <class T>
  struct underlying_type {
    using type = ;
  };

  template <class T>
  using underlying_type_t = typename underlying_type<T>::type; // C++14
}

概要

列挙型の基底型を取得する。

C++11以降の列挙型(enumenum classenum structで定義された型)は、列挙子の値を表現するための基底型を指定できる:

// 基底型にcharを指定。
// 列挙子の値を表現するためにcharが使用される。
enum class CharColor : char {
  Red, Green, Blue
};

// 基底型を指定しない場合、
// enum classではintがデフォルトの基底型となる。
enum class IntColor {
  Red, Green Blue
};

underlying_typeを使用することで、列挙型に設定された基底型を取得できる。

要件

  • C++11 : 型Tが列挙型であること。(完全型を要求するかどうかは未規定)
  • C++14 : 型Tが完全な列挙型であること。

効果

underlying_typeは、列挙型Tの基底型を、メンバ型typeとして定義する。

#include <type_traits>

enum E1 : char {};
enum class E2 : char {};

enum E3 {};
enum class E4 {};

static_assert(std::is_same<std::underlying_type<E1>::type, char>::value, "E1 based type is char");
static_assert(std::is_same<std::underlying_type<E2>::type, char>::value, "E2 based type is char");

static_assert(std::is_integral<std::underlying_type<E3>::type>::value == true, "E3 based type is integral type");
static_assert(std::is_integral<std::underlying_type<E4>::type>::value == true, "E4 based type is integral type");

int main() {}

出力

バージョン

言語

  • C++11

処理系

関連項目

参照