mirror of
https://github.com/Light-City/CPlusPlusThings.git
synced 2026-10-28 19:04:45 +08:00
- const README: rewrite the space-saving claim per issue #5 follow-ups (constant-expression const vs #define immediates; which const qualify as constant expressions) - const README: fix the class-section diagnosis per issue #338 (overload resolution picks the const overload; the restriction only surfaces once that overload is removed) - sizeof README: virtual-inheritance result is compiler-dependent (GCC merges vbptr+vfptr -> 16, MSVC keeps them separate -> 32) #246 - static README: new section on internal linkage / access restriction with anonymous-namespace comparison #142 - 10-day practice: full problem list table + fixed day links #136 - new design_pattern/singleton/singleton_default.hpp: reusable thread-safe CRTP singleton template, compile+concurrency tested #303
73 lines
1.8 KiB
Markdown
73 lines
1.8 KiB
Markdown
> 本文档由 [C++那些事网站](https://light-city.github.io/stories_things/cpp-idioms/enum-class/) 同步生成,网站版本含多语言与更新排版。
|
||
|
||
# C++ enum class 强类型枚举
|
||
|
||
在Effective modern C++中Item 10: Prefer scoped enums to unscoped enum,调到要用有范围的enum class代替无范围的enum。
|
||
|
||
例如:
|
||
|
||
```cpp
|
||
enum Shape {circle,retangle};
|
||
auto circle = 10; // error
|
||
```
|
||
|
||
上述错误是因为两个circle在同一范围。
|
||
对于enum等价于:
|
||
```cpp
|
||
#define circle 0
|
||
#define retangle 1
|
||
```
|
||
因此后面再去定义circle就会出错。
|
||
|
||
所以不管枚举名是否一样,里面的成员只要有一致的,就会出问题。
|
||
例如:
|
||
```cpp
|
||
enum A {a,b};
|
||
enum B {c,a};
|
||
```
|
||
a出现两次,在enum B的a处报错。
|
||
|
||
根据前面我们知道,enum名在范围方面没有什么作用,因此我们想到了namespace,如下例子:
|
||
```cpp
|
||
// 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
|
||
namespace EntityType {
|
||
enum Enum {
|
||
Ground = 0,
|
||
Human,
|
||
Aerial,
|
||
Total
|
||
};
|
||
}
|
||
|
||
void foo(EntityType::Enum entityType)
|
||
{
|
||
if (entityType == EntityType::Ground) {
|
||
/*code*/
|
||
}
|
||
}
|
||
```
|
||
将命名空间起的有意思点,就可以达到想要的效果。
|
||
|
||
但是不断的使用命名空间,势必太繁琐,而且如果我不想使用namespace,要达到这样的效果,便会变得不安全,也没有约束。
|
||
|
||
因此在c++11后,引入enum class。
|
||
|
||
enum class 解决了为enum成员定义类型、类型安全、约束等问题。
|
||
回到上述例子:
|
||
```cpp
|
||
// enum class
|
||
enum class EntityType {
|
||
Ground = 0,
|
||
Human,
|
||
Aerial,
|
||
Total
|
||
};
|
||
|
||
void foo(EntityType entityType)
|
||
{
|
||
if (entityType == EntityType::Ground) {
|
||
/*code*/
|
||
}
|
||
}
|
||
```
|
||
这便是这一节要阐述的惯用法:enum class。 |