假设我有一个枚举定义了一个通用选项,如下所示:
enum valueState
{
uninitialized,
min,
max
}现在假设我对特定的值类型有一个更具体的值状态,假设:
enum floatValueState
{
nan
}是否有任何方法可以将valueState选项作为floatValueStates传递?或者,有没有其他方法可以在编译时实现这种选择的抽象,而不会有太多的模板噪声。
编辑: Ofc它们可以隐式地转换为枚举类型,但如何在没有重叠值的情况下组合两个枚举(如0=未初始化,4=无),而不指定我将组合多少枚举。
发布于 2017-07-19 20:55:34
因为旧式的enums (非类)只是整数(隐式转换),所以您可以传递它们,而不考虑您实际使用的是什么。这很危险,但可以让你轻松地做你想做的事情。不过,您需要对这些值进行微观管理,以确保nan和uninitialized不是一回事:
enum floatValueState {
nan = 3
}任何接受floatValueState的东西都会隐式地接受ValueState,而不需要额外的工作--这是您想要的,但也是危险的。具体地说,任何接受ValueState的东西都会接受floatValueState --这可能会破坏一些东西。
发布于 2017-07-19 20:56:49
虽然在技术上可以解决这个问题(参见另一个答案),但存在一些理论问题:这可能违反了Liskov Substitution Principle。这个原则指导我们如何在合理的面向对象设计中使用继承。
它声明:“基本类型”的每个“用法”--你可以在那里插入“派生类型”。
在这种情况下,您将如何在这里“嵌入”“附加信息”?
换句话说(伪代码):
valueState value = ...
if (value == min || max) {
... } else {
value must be uninitialized但是如果value现在变成了floatValueState呢?!
https://stackoverflow.com/questions/45191204
复制相似问题