
70
|
3 章 現代の C++ への移行
return static_cast<std::underlying_type_t<E>>(enumerator);
}
C++14 の、簡便性に優れる auto の戻り型も併用可能です(項目 3 を参照)。
template<typename E> // C++14
constexpr auto
toUType(E enumerator) noexcept
{
return static_cast<std::underlying_type_t<E>>(enumerator);
}
どのように記述した場合でも、toUType は次のようにタプルのフィールドへのアクセスを可能に
してくれます。
auto val = std::get<toUType(UserInfoFields::uiEmail)>(uInfo);
上例でも、記述量はスコープを持たない enum よりまだ多いのですが、名前空間の汚染と列挙子の
想定外の変換は発生しません。enum の落とし穴を避けられるならば、デジタル通信が 2400 ボーの
モデムだった時代でも、タイプ量が若干増える程度は充分見合うことはまず間違いないでしょう。
重要ポイント
•
C++98 スタイルの enum は現在ではスコープを持たない enum と呼ばれる(unscoped enum)。
•
スコープを持つ enum(scoped enum)の列挙子は enum 内でのみその名前が有効である。他
の型へ変換する場合はキャストが必要である。 ...