在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};