使用强类型枚举而不是列有一些好的参数。然而,除了它不需要的风险之外,可转换为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 ) {
...
}
}
我确实错过了旧枚举的这些功能,我可能不是唯一的。什么是使用强类型枚举的好方法,仍然可以轻松记录并比较它们?
答案 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更深入。