强类型枚举的c ++转换

时间:2017-02-01 04:35:08

标签: c++

使用强类型枚举而不是列有一些好的参数。然而,除了它不需要的风险之外,可转换为int提供了一些不错的用例。在我的情况下,主要是把它扔进一个字符串流中进行记录和比较。

enum RiskLevel { None, Warn, Low, High, Critical };

void logStuff( RiskLevel rl ) {
    stringstream ss;
    ss << rl;
    LOG(s);
}

void compareEnum( RiskLevel rl ) {
    if ( rl > RiskLevel::Low ) {
        ... 
    }
}

我确实错过了旧枚举的这些功能,我可能不是唯一的。什么是使用强类型枚举的好方法,仍然可以轻松记录并比较它们?

4 个答案:

答案 0 :(得分:4)

您可以使用std::underlying_type

void logStuff( RiskLevel rl ) {
    typedef std::underlying_type<RiskLevel>::type int_type;
    stringstream ss;
    ss << int_type(rl);
    Logger(ss);
}

答案 1 :(得分:2)

您可以(另外)实现自己的日志记录和比较重载,从而为您提供更大的灵活性:

std::ostream& operator<<(ostream& os, RiskLevel rl) {
    os << std::underlying_type<RiskLevel>::type(rl);
    return os;
}

bool operator<(RiskLevel rl1, RiskLevel rl2) {
    return std::underlying_type<RiskLevel>::type(rl1) <
               std::underlying_type<RiskLevel>::type(rl2);
}

然后你可以让流插入操作符实际记录,例如,枚举器的名称。

答案 2 :(得分:2)

也许利用c ++ 11的枚举类。您可以明确指定您想要的枚举类型。

enum class Boo : char {
    START = 'S',
    END = 'E'
};

enum class Foo :  unsigned int {
    TOP = 1,
    BOTTOM = 2
};

答案 3 :(得分:1)

定义一元+运算符以执行转换为整数类型。

enum RiskLevel { None, Warn, Low, High, Critical };

auto operator + ( RiskLevel value )
    { return std::underlying_type_t< RiskLevel >( value ); }

void logStuff( RiskLevel rl ) {
    stringstream ss;
    ss << + rl;
    LOG(s);
}

void compareEnum( RiskLevel rl ) {
    if ( + rl > + RiskLevel::Low ) {
        ... 
    }
}

this answer更深入。