Skip to content

Latest commit

 

History

History
79 lines (61 loc) · 1.83 KB

File metadata and controls

79 lines (61 loc) · 1.83 KB

条款10:优先选用限定作用域的枚举类型,而非不限定作用域的枚举类型

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);