std::underlying_type
From cppreference.com
| ヘッダ <type_traits> で定義 |
||
| template< class T > struct underlying_type; |
(C++11以降) | |
T が完全な列挙型 (enum) である場合、T の基底型を指すメンバ `typedef` である `type` を提供します。
|
それ以外の場合、動作は未定義です。 |
(C++20まで) |
|
それ以外の場合、 |
(C++20以降) |
プログラムが std::underlying_type の特殊化を追加した場合、その動作は未定義です。
目次 |
[編集] メンバ型
| 名前 | 定義 |
type
|
T の基底型 |
[編集] ヘルパー型
| template< class T > using underlying_type_t = typename underlying_type<T>::type; |
(C++14以降) | |
[編集] 注記
各 列挙型 は、基底型 を持ちます。これは次のようなものです。
- 明示的に指定される(スコープ付きおよびスコープなしの列挙の両方)。
- 省略される場合、スコープ付き列挙型の場合は 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) |
型が列挙型であるかをチェックする (クラステンプレート) |
| (C++23) |
型がスコープ付き列挙型であるかをチェックする (クラステンプレート) |
| (C++23) |
列挙型をその基底となる型に変換する (関数テンプレート) |