1. 導入:列挙型と数値の変換、どうしていますか?
C++で列挙型(enumやenum class)を使っているとき、「この列挙型の値を使って、配列のインデックスを指定したい」「数値として計算に使いたい」と思ったことはありませんか?
列挙型は通常、整数型として扱われますが、明示的に「これはどの整数型(intやcharなど)として保存されているのか」を取得したい場合があります。そんな時に便利なのが、C++14で導入された std::underlying_type_t です。これを使うことで、列挙型の基底型を簡単に特定し、安全かつ柔軟なプログラムを書くことができます。
2. 基礎知識:基底整数型とは?
C++の列挙型は、内部的に特定の整数型(char, int, longなど)を割り当てて値を保持しています。これを「基底整数型」と呼びます。
例えば、enum classで定義した列挙型は、デフォルトではint型ですが、開発者が明示的に型を指定することも可能です。
std::underlying_type_t を使うと、コンパイラがその列挙型をどのような整数型として解釈しているかを自動的に調べてくれるため、コードの柔軟性が大幅に向上します。
3. 実装:std::underlying_type_tの使い方
使い方は非常にシンプルです。列挙型をテンプレート引数として渡すだけです。
具体的には、以下のように使用します。
std::underlying_type_t<列挙型名> 変数名;
このように記述することで、その列挙型の裏側にある整数型と同じ型の変数を定義できます。これにより、列挙型の定義を後から変更しても(例: intからshortに変更)、それに合わせて変数の型も自動的に追従するため、修正漏れを防ぐことができます。
4. サンプルプログラム
以下は、列挙型から基底型を取得し、それを数値として出力する実用的なサンプルコードです。
include
include
// char型を基底とする列挙型を定義
enum class Status : char {
Ready = 0,
Running = 1,
Finished = 2
};
int main() {
// Statusの基底型を取得して、同じ型の変数を作成
std::underlying_type_t
// 数値として扱えることを確認 std::underlying_type_t を使う際の重要なポイントをいくつか挙げます。 ・型変換の明示: 列挙型から基底型へ変換する際は、常に static_cast を併用してください。C++の型安全性を保つために必須の作法です。 最初は少し難しく感じるかもしれませんが、列挙型と数値を橋渡しする強力なツールです。ぜひ日々の開発で活用してみてください。
std::cout << "列挙型の内部数値は: " << static_cast
std::cout << "この列挙型の基底型は char です。" << std::endl;
}
return 0;
}
5. 応用・注意点
・C++14以降が必要: この機能はC++14で導入されました。それ以前のC++11環境では typename std::underlying_type
・設計上のメリット: テンプレートメタプログラミングにおいて、どのような列挙型が渡されても、その内部の整数型を正確に扱えるため、ライブラリ開発などで特に重宝されます。

コメント