【发布时间】:2014-07-02 17:46:27
【问题描述】:
例如,我有一个基类Event,我想确保从Event 派生的每个类都定义了一个enum class Type 成员,因此T::Type 是任何类T 的有效类型源自Event。
【问题讨论】:
-
没有相当简单的方法。您在这里要解决的真正问题是什么?
-
您希望这个嵌套类型成为
enum class的事实表明您希望不同的派生类包含不同的值——但肯定没有办法保证这一点静态的。例如。在class A : public Event { enum class Type { X }; }; class B : public Event { enum class Type { X }; };、A::Type::X和B::Type::X之后的类型不同但值相同(转换为int后)。 -
你是对的。我想这对我来说又回到了绘图板上。我的最终目标是确保对于每种事件,仅使用某种类型(源自
Event)。 (即鼠标按钮按下事件使用MouseEvent,而不是KeyboardEvent) -
模板可以用吗?
-
您必须决定是关闭您的活动集还是打开以进行扩展。如果关闭,这很容易——只需将
enum class Type { Keyboard, Mouse };放在基类Event内即可。如果打开,我会看到 2 个选择:要么要求每个事件类型为自己提供一个您可以确定是唯一的 ID,无论以后添加多少其他事件类型(例如字符串或 GUID),或者每个事件类型向某个全局注册表“注册”自身并从中接收其 ID(这可以通过例如给每个派生类一个static其 ctor 注册它的成员来完成)。
标签: c++ inheritance compile-time static-assert