如何定义可扩展的C++枚举系统

rec*_*hen 2 c++ macros enums templates

我的枚举项目遇到了问题.在EventDef.h中,

enum EventDef {
    EVT1 = 0,
    EVT2,
    EVT3,
    EVT_NUM,
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以在另一个头文件UIEventDef.h中扩展EventDef系统

#include "EventDef.h"
enum UIEventDef {
    UIEVT1 = EVT_NUM,
    UIEVT2,
    UIEVT3,
}
Run Code Online (Sandbox Code Playgroud)

但是,有一个限制,我不能以同样的方式在NetEvent.h中这样做.

#include "EventDef.h"
enum NetEventDef {
    NETEVT1 = EVT_NUM,
    NETEVT2,   //wrong: this will have the same value as UIEVT2
    NETEVT3,  
}
Run Code Online (Sandbox Code Playgroud)

在C++中是否有更好的编译时解决方案,例如可以提供帮助的模板?

wal*_*rii 6

可扩展枚举的想法本质上不是"糟糕的设计".在其他语言中有它们的历史,即使c ++不直接支持它们.有不同种类的可扩展性.

可扩展枚举的内容对我们有用

  • 错误代码
  • 消息类型
  • 设备标识(OID是类似系统的分层枚举)

枚举可扩展性的示例

  • 目标Modula Two具有可扩展的枚举,类似继承.
  • Java中的可扩展枚举模式,可以用c ++实现.
  • Java枚举是可扩展的,因为额外的数据和方法可以是枚举的一部分.
  • 在c ++中,typeid运算符本质上是一个带有附加值的编译器生成的枚举.

您在示例代码中显示的那种可扩展性在单独的c ++中没有优雅的实现.事实上,正如您所指出的,它很容易导致问题.

想想你如何使用可扩展的枚举.也许不可变单例对象的集合/映射将满足您的需求.

在c ++中使用可扩展枚举的另一种方法是使用代码生成器.每个想要添加到可扩展枚举的编译单元都将id记录在它自己的单独的.enum文件中.在构建时,在编译之前,脚本(即p​​erl,bash,...)查找所有.enum文件,读取它们,为每个id分配数值,并写出一个与任何其他文件一样包含的头文件.