当年写 C。
枚举就是几个整数。
名字直接裸奔。
你写 RED。
全世界都能看见。
这当然方便。
也当然会撞名。
当年:枚举值是全局污染
你项目里只要有两个模块。
一个也有 OK。
另一个也有 OK。
你就开始改名。
改成 NET_OK。
改成 UI_OK。
改到最后。
你怀疑自己在写宏。
C++11:enum class 把名字收进作用域
enum class 很好。
它把枚举值关进了枚举类型里。
enum class Status {
Ok,
Bad,
};
Status s = Status::Ok;
安全。
不撞名。
但也啰嗦。
线上啪一下:日志里全是 Status::Status::Status
你写一个小项目。
到处打日志。
到处写 switch。
你会发现你写的不是业务。
你在写前缀。
switch (s) {
case Status::Ok:
break;
case Status::Bad:
break;
}
这段代码没错。
只是读起来有点磨人。
C++20:using enum
C++20 给了一个折中。
你可以在一个小作用域里。
把枚举值“引入当前作用域”。
enum class Status { Ok, Bad };
void handle(Status s) {
using enum Status;
switch (s) {
case Ok:
break;
case Bad:
break;
}
}
这里的 Ok。
不是全局的。
它只在 handle 里有效。
你刚学 C++ 会卡:这会不会又把名字弄脏
会。
但它是可控的。
你把它放在函数里。
放在一个小块里。
污染范围很小。
你要是把它放在头文件的全局作用域。
那你就又回到当年了。
关键结论
using enum 是“在小范围里换可读性”。
别拿它当全局偷懒。
小结
enum class 给你安全。
using enum 给你顺手。
你把它们搭配着用。
才像工程。