Morden Enum 巧用C++结构体封装枚举,实现类型安全和操作封装

本文介绍了C++中现代化枚举类型的应用,通过结构体封装枚举,解决传统枚举可能导致的命名冲突问题。文章讨论了C++11的强枚举类型和命名空间作为解决方案,进一步探讨了如何通过结构体实现类似类的封装,包括添加自定义操作。同时,提出了使用宏定义来减少重复工作量的方法。
摘要由CSDN通过智能技术生成

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. 传统的解决方式

  1. 解决方法一:借助于语言本身的特性
    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;
  1. 解决方法二:借助于名字空间(命名空间)
    第二种方法,我们可以为每一个枚举定义一个名字空间,将枚举放到名字空间中去,并将枚举的类型名统一定为 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值