
74
|
第
3
章
更时髦的
auto
返回值(参见条款
3
)在
C++14
中也合法:
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);
即使这样写,使用限定作用域的枚举型别还是比不限范围的枚举型别打的字要多,可
是,它还是避免了名字空间污染和无意进行的涉及枚举量的隐式型别转换。在众多情
况下,你可能会同意,多打一些字尚算是一种合理的代价,付出这样的代价所获得的
能力,是避免了枚举型别技术带来的陷阱。毕竟在这种技术刚发明出来的时代,最尖
端的数据通信还在用
2400
波特率的调制解调器呢。
要点速记
•
C++98
风格的枚举型别,现在称为不限范围的枚举型别。
•
限定作用域的枚举型别仅在枚举型别内可见。它们只能通过强制型别转换
以转换至其他型别。
•
限定作用域的枚举型别和不限范围的枚举型别都支持底层型别指定。限定
作用域的枚举型别的默认底层型别是
int
,而不限范围的枚举型别没有默认
底层型别。
•
限定作用域的枚举型别总是可以进行前置声明,而不限范围的枚举型别却
只有在指定了默认底层型别的前提下才可以进行前置声明。 ...