Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 依赖整数布尔转换的枚举_C++_Boolean_Enumeration - Fatal编程技术网

C++ 依赖整数布尔转换的枚举

C++ 依赖整数布尔转换的枚举,c++,boolean,enumeration,C++,Boolean,Enumeration,在我的编译器项目中,我有一个枚举 enum Result { No, Maybe, Yes }; 我已将No明确地放在第一个位置,这样我就可以依靠布尔运算来false。如果我的编译器对某些事情不确定,并且必须等到运行时才知道事实,那么它的分析函数将返回Maybe。像 if(!typesEqual(t1, t2)) { diagnose(types_unequal) << t1 << t2; } 显式比较在我看来似乎很冗长,但依赖隐式布尔转换不知何故让我

在我的编译器项目中,我有一个枚举

enum Result {
  No,
  Maybe,
  Yes
};
我已将
No
明确地放在第一个位置,这样我就可以依靠布尔运算来
false
。如果我的编译器对某些事情不确定,并且必须等到运行时才知道事实,那么它的分析函数将返回
Maybe
。像

if(!typesEqual(t1, t2)) {
  diagnose(types_unequal) << t1 << t2;
}

显式比较在我看来似乎很冗长,但依赖隐式布尔转换不知何故让我感到内疚。您以前有过这种感觉吗?您是如何处理的?

我也会为此感到内疚,因为通过阅读上面的代码,您会期望布尔
typesEqual()
表达式返回一个
可能
?它会变成真的吗?大概它会返回false吗?大概我们不知道-这就是枚举的全部要点。这就是为什么显式地与
No
进行比较是有意义的,尽管它更为详细。

对于整数或指针类型,我通常不使用与零的显式比较,因为向布尔值的转换是定义明确且显而易见的

但是,我总是对枚举使用显式比较,以防有人更改枚举的定义。毕竟,您永远无法确定有人以后不会更改枚举


依赖枚举数的基本数值似乎是个坏主意。

我不喜欢的是它是不对称的

你在某处真正想要的是

if(typesEqual(t1, t2) == Yes) {
    do_something();
}
但你写这封信是偶然的

if(typesEqual(t1, t2)) {
    do_something();
}
你可以用布尔技巧表示“否”,但不能表示“是”,这似乎有点奇怪/丑陋

我想我可以通过将函数重命名为
tryCompareTypes(t1,t2)
来解决这个问题,并将枚举更改为

enum Result {
  Maybe,
  No,
  Yes
};

因此,
tryCompareTypes()
如果无法确定类型是否相等,则返回0,否则返回No或Yes,两者均为非零,因此表示“成功”。

这似乎类似于。Tribool支持在条件语句中使用到bool的转换,这似乎表明在这种情况下隐式转换到bool并不坏,至少根据Boost组织的说法(我发现他是相当合理的)。

我想我要将其转换为CW,因为这似乎更像是一个风格问题!
enum Result {
  Maybe,
  No,
  Yes
};