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
};