Morden Enum (现代化的枚举类型)
1. 传统的枚举类型
C++的传统枚举类型定义格式为 enum <枚举名> { <枚举常量表> }
例如:enum workflow_1 { Starting, Connecting, Receiving, Stoped};
这个例子中定义了项目中一个业务流程的四个状态,Starting(启动中), Connecting(连接中),Receiving(接收中),Stopped(已停止)。当你处于刚入门的学习者时,可能觉得这样一切安好,但是,当项目的业务流程增加了的情况怎么办。
例如,现在老板定义了一个新的业务流程给你,你定义好的新枚举类型如下:enum workflow_2 { Starting, Dealing, Paused, Stopped};
。此时 workflow_1 和 workflow_2 就会产生冲突,因为他们的常量表中 Starting、Stopped 是重复的。
enum workflow_1
{
Starting,
Connecting,
Receiving,
Stopped
};
enum workflow_2
{
Starting, // 错误:Starting 重复定义
Dealing,
Paused,
Stopped // 错误:Stopped 重复定义
};
2. 传统的解决方式
- 解决方法一:借助于语言本身的特性
C++ 11 推出了强枚举类型enum class
,借助于此,我们可以将上述的业务流程定义为
enum class workflow_1
{
Starting,
Connecting,
Receiving,
Stopped
};
enum class workflow_2
{
Starting, // OK
Dealing,
Paused,
Stopped // OK
};
使用时则必须加上枚举的名字
workflow_1 w1 = workflow_1::Starting;
workflow_2 w2 = workflow_2::Starting;
- 解决方法二:借助于名字空间(命名空间)
第二种方法,我们可以为每一个枚举定义一个名字空间,将枚举放到名字空间中去,并将枚举的类型名统一定为type
,以保证统一性。
namespace workflow_1
{
enum type
{
Starting,
Connecting,
Receiving,
Stopped
};
}
namespace workflow_2
{
enum class type
{
Starting, // OK, 此命名空间中的枚举元素不受workflow_1的影响
Dealing,
Paused,
Stopped // OK, 此命名空间中的枚举元素不受workflow_1的影响
};
}
int main()
{
workflow_1::type w1 = workflow_1::Starting;
workflow_2::type w2 = workflow_2::Starting;
}
3. 进一步思考
在实际的项目中,我们除了要定义枚举之外,我们还需要对枚举进行一系列的操作&#x