在C ++中扩展枚举?

有没有在C + +的方式来扩展/“inheritance”枚举?

IE:

enum Enum {A,B,C}; enum EnumEx : public Enum {D,E,F}; 

或至less定义它们之间的转换?

不,那里没有。

enum在C ++中确实是可怜的东西,这当然是不幸的。

即使在C ++ 0x中引入的class enum也没有解决这个可扩展性问题(尽pipe它们至less为了types安全做了一些事情)。

enum的唯一好处是它们不存在:它们提供了一些types安全性,而不会增加任何运行时开销,因为它们被编译器直接replace。

如果你想要这样一个野兽,你必须自己工作:

  • 创build一个MyEnum类,它包含一个int(基本上)
  • 为每个有趣的值创build命名构造函数

你现在可以扩展你的类(添加命名构造函数)

这是一个解决方法,但我从来没有find一个满意的方式来处理一个枚举…

如果你能够创build一个枚举的子类,它将不得不反过来工作。

子类中的实例集合是超类中实例的一个子集 。 想想标准的“形”的例子。 Shape类表示所有形状的集合。 Circle类,它的子类,代表了Circle的子集。

因此,为了保持一致,枚举的子类必须包含它inheritance的枚举中元素的一个子集。

(不,C ++不支持这个。)

我已经用这种方式解决了

 typedef enum { #include "NetProtocols.def" } eNetProtocols, eNP; 

当然,如果你在NetProtocols.def文件中添加一个新的networking协议,你必须重新编译,但至less它是可扩展的。

只是一个想法:

你可以尝试为每个常量创build一个空的类(也许把它们放在同一个文件中以减less混乱),创build每个类的一个实例,并使用指向这些实例的指针作为“常量”。 这样,编译器将会理解inheritance,并且在使用函数调用时将执行任何必要的ChildPointer-to-ParentPointer转换,并且编译器仍然会进行types安全检查,以确保没有人将无效的int值传递给函数如果您使用LAST值方法来“扩展”枚举)。

尽pipe如此,还没有完全想到这一点,所以对这种方法的任何意见,

我会尽快发表一个我有什么意思的例子。

以下代码运行良好。

 enum Enum {A,B,C}; enum EnumEx {D=C+1,E,F};