bool like enumeration in C++

在 Stack Overflow 上回答了一个问题: How can I use an enum class in a boolean context?,记录下。

C++ 11 的 explicit operator bool() 可以让类类型的值使用在条件语句中,但无法对 enum 类型提供支持。

下面是我使用的一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Error {
enum {
None = 0,
Error1 = 1,
Error2 = 2,
} Value;

/* implicit */ Error(decltype(Value) value = None) : Value(value) {}

explicit operator bool() {
return Value != None;
}
};

inline bool operator==(Error a, Error b) {
return a.Value == b.Value;
}

inline bool operator!=(Error a, Error b) {
return !(a==b);
}

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Error lastError();

if (auto err = lastError()) {
}

switch (lastError().Value) {
case Error::None:
break;
case Error::Error1:
break;
default:
break;
}

if (lastError() == Error::Error1) {
}