Enum协方差/多态?

时间:2017-07-19 12:52:04

标签: c++ enums

想象一下,我有一个定义常见选项的枚举,如:

enum valueState
{
   uninitialized,
   min,
   max
}

现在假设我对特定值类型有一个更具体的值状态,让我们说:

enum floatValueState
{
   nan
}

有没有办法将valueState选项作为floatValueStates传递?或者是否有其他方法可以在编译时实现这种抽象选择,而不会产生太多的模板噪声。

编辑: 它们可以隐式转换为枚举类型,但是如何在没有重叠值的情况下组合两个枚举(例如0 =未初始化,4 =非),而不指定我将合并多少个枚举。

2 个答案:

答案 0 :(得分:3)

因为旧样式enums(非类)只是整数(隐式转换),所以你可以忽略它实际使用它来传递它们。这很危险,但可以让你轻松地做你想做的事。您需要对值进行微观管理,以确保nanuninitialized不是一回事:

enum floatValueState {
   nan = 3
}

任何接受floatValueState的内容都会隐含地接受ValueState,没有额外的工作 - 你想要什么,但又是危险的。具体来说,接受ValueState的任何内容也会接受floatValueState - 这可能会破坏内容。

答案 1 :(得分:0)

虽然技术上可以解决这个问题(参见另一个答案) - 但是存在一些理论问题:这可能违反了Liskov Substitution Principle。该原则指导我们如何在声音OO设计中使用继承。

并指出:每个"用法" "基本类型" - 您可以插入"派生类型"那里。

鉴于上下文 - 你将如何嵌入"那"其他信息 nan "这里吗?

换句话说(伪代码):

 valueState value = ...
 if (value == min || max) {
 ... } else {
   value must be uninitialized

但如果value现在是floatValueState怎么办?!