强类型枚举(enum class)

强类型枚举(enum class)

C++11enum class 主要是为了解决传统枚举的两个老问题:作用域污染类型不够严格

1. 传统枚举的问题

1
2
3
4
5
6
7
8
9
10
11
enum Color {
Red,
Green,
Blue
};

enum TrafficLight {
Red,
Yellow,
Green
};

上面这段代码就有明显问题:不同枚举里的名字会跑到同一个作用域里,容易冲突。

另外,传统枚举和整数之间的转换也比较宽松,不够严谨。

2. C++11 的 enum class

1
2
3
4
5
enum class Color {
Red,
Green,
Blue
};

这时访问枚举值时必须带上作用域:

1
Color c = Color::Red;

3. 它的两个主要优点

3.1 不污染外部作用域

1
2
enum class Color { Red, Green };
enum class TrafficLight { Red, Yellow };

这样两个 Red 就不会冲突。

3.2 类型更严格

1
2
Color c = Color::Red;
// int x = c; // 不能隐式转换

这种限制很多时候反而能减少误用。

4. 一个简单例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;

enum class Direction
{
Left,
Right,
Up,
Down
};

int main()
{
Direction dir = Direction::Left;
if (dir == Direction::Left) {
cout << "go left" << endl;
}
return 0;
}

5. 指定底层类型

和传统枚举一样,enum class 也可以指定底层类型:

1
2
3
4
enum class Status : int {
Ok = 0,
Error = 1
};

6. 如果确实要转成整数

可以显式转换:

1
int value = static_cast<int>(Status::Ok);

这种“必须显式转换”的设计,本身也是类型安全的一部分。

总结

enum class 是现代 C++ 里非常值得优先使用的一种枚举写法。
相比传统 enum,它作用域更清晰,类型限制更严格,更适合工程代码。只要没有兼容旧接口的压力,新代码里一般都更推荐直接用 enum class