名前空間
変種
操作

std::underlying_type

From cppreference.com
< cpp‎ | types
 
 
メタプログラミングライブラリ
型特性
型のカテゴリ
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
型のプロパティ
(C++11)
(C++11)
(C++14)
(C++11)(C++26で非推奨)
(C++11)(C++20まで*)
(C++11)(C++20で非推奨)
(C++11)
型特性定数
メタ関数
(C++17)
サポートされている操作
関係とプロパティクエリ
型の変更
(C++11)(C++11)(C++11)
型の変換
(C++11)(C++23で非推奨)
(C++11)(C++23で非推奨)
(C++11)
(C++11)(C++20まで*)(C++17)

underlying_type
(C++11)
(C++11)
(C++17)
コンパイル時有理数演算
コンパイル時整数シーケンス
 
ヘッダ <type_traits> で定義
template< class T >
struct underlying_type;
(C++11以降)

T が完全な列挙型 (enum) である場合、T の基底型を指すメンバ `typedef` である `type` を提供します。

それ以外の場合、動作は未定義です。

(C++20まで)

それ以外の場合、T が列挙型でない場合は、メンバ `type` は存在しません。それ以外の場合(T が不完全な列挙型である場合)、プログラムは不正形式となります。

(C++20以降)

プログラムが std::underlying_type の特殊化を追加した場合、その動作は未定義です。

目次

[編集] メンバ型

名前 定義
type T の基底型

[編集] ヘルパー型

template< class T >
using underlying_type_t = typename underlying_type<T>::type;
(C++14以降)

[編集] 注記

列挙型 は、基底型 を持ちます。これは次のようなものです。

  1. 明示的に指定される(スコープ付きおよびスコープなしの列挙の両方)。
  2. 省略される場合、スコープ付き列挙型の場合は int、スコープなし列挙型の場合は、enum のすべての値を表現できる実装定義の整数型となります。

[編集]

#include <iostream>
#include <type_traits>
 
enum e1 {};
enum class e2 {};
enum class e3 : unsigned {};
enum class e4 : int {};
 
int main()
{
    constexpr bool e1_t = std::is_same_v<std::underlying_type_t<e1>, int>;
    constexpr bool e2_t = std::is_same_v<std::underlying_type_t<e2>, int>;
    constexpr bool e3_t = std::is_same_v<std::underlying_type_t<e3>, int>;
    constexpr bool e4_t = std::is_same_v<std::underlying_type_t<e4>, int>;
 
    std::cout
        << "underlying type for 'e1' is " << (e1_t ? "int" : "non-int") << '\n'
        << "underlying type for 'e2' is " << (e2_t ? "int" : "non-int") << '\n'
        << "underlying type for 'e3' is " << (e3_t ? "int" : "non-int") << '\n'
        << "underlying type for 'e4' is " << (e4_t ? "int" : "non-int") << '\n';
}

実行結果の例

underlying type for 'e1' is non-int
underlying type for 'e2' is int
underlying type for 'e3' is non-int
underlying type for 'e4' is int

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2396 C++11 不完全な列挙型が許可されていました 完全な列挙型が必要です

[編集] 関連情報

(C++11)
型が列挙型であるかをチェックする
(クラステンプレート) [編集]
型がスコープ付き列挙型であるかをチェックする
(クラステンプレート) [編集]
列挙型をその基底となる型に変換する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)