想象一下,我有一个定义常见选项的枚举,如:
enum valueState
{
uninitialized,
min,
max
}
现在假设我对特定值类型有一个更具体的值状态,让我们说:
enum floatValueState
{
nan
}
有没有办法将valueState选项作为floatValueStates传递?或者是否有其他方法可以在编译时实现这种抽象选择,而不会产生太多的模板噪声。
编辑: 它们可以隐式转换为枚举类型,但是如何在没有重叠值的情况下组合两个枚举(例如0 =未初始化,4 =非),而不指定我将合并多少个枚举。
答案 0 :(得分:3)
因为旧样式enums
(非类)只是整数(隐式转换),所以你可以忽略它实际使用它来传递它们。这很危险,但可以让你轻松地做你想做的事。您需要对值进行微观管理,以确保nan
和uninitialized
不是一回事:
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怎么办?!