C++11中,限定作用域的(scoped)枚举类型,不会泄露名字:
enum class Color { black, white, red };
auto white = false;
Color c = white; // error!
Color c = Color::white; // ok
auto c = Color::white; // ok
限定作用域的枚举类型是强类型的,不会发生隐式类型转换。
std::vector<std::size_t>
primeFactors(std::size_t x);
if (static_cast<double>(c) < 14.5) {
auto factors =
primeFactors(static_cast<std::size_t>(c));
}
限定作用域的枚举类型可以进行前置声明(底层类型默认为int
)
enum class Status; // 前置声明
void continueProcessing(Status s);
但是不限定枚举类型必须指出底层类型(C++11)
enum Color: std::unit8_t; // 前置声明
在使用std::tuple
类型时,采用一个不限范围的枚举类型和域序数关联可以增强可读性:
using UserInfo = std::tuple<std::string,
std::string,
std::size_t>;
enum UserInfoFields { uiName, uiEmail, uiReputation };
UserInfo uInfo;
...
auto val = std::get<uiEmail>(uInfo);
如果使用限定范围的枚举类型,就需要编写转换函数:
template <typename E>
constexpr typename std::underlying_type<E>::type
toUType(E enumerator) noexcept
{
return
static_cast<typename
std::underlying_type<E>::type>(enumerator);
}
C++14可以简化为:
template <typename E>
constexpr auto
toUType(E enumerator) noexcept
{
return static_cast<std::underlying_type_t<E>>(enumerator);
}
toUType
让我们可以用下面的方式访问元组中的一个域:
auto val = std::get<toUType(UserInfoFields::uiEmail)>(uInfo);