【问题标题】:Enumeration relying on integer boolean conversion枚举依赖整数布尔转换
【发布时间】:2010-07-07 02:21:22
【问题描述】:

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

enum Result {
  No,
  Maybe,
  Yes
};

我已将No 明确放在第一位,这样我就可以依赖false 的布尔评估。如果我的编译器不确定某事,并且必须等待事实直到运行时,它的分析函数将返回Maybe。像这样使用

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

我想知道您或您的公司是否认为不与No 明确比较是不好的风格

if(typesEqual(t1, t2) == No) { /* ... */ }

明确比较对我来说似乎很罗嗦,但依赖隐式布尔转换让我感到内疚。你以前有过这种感觉吗,你是怎么处理的?

【问题讨论】:

  • 我想我要把它变成 CW,因为它看起来更像是一个风格问题!

标签: c++ boolean enumeration


【解决方案1】:

我也会对此感到内疚,因为通过阅读上面的代码你会期望布尔 typesEqual() 表达式返回一个 Maybe 吗?它会返回真实吗?也许!它会返回false吗?也许!我们不知道——这就是枚举的全部意义所在。这就是为什么明确比较 No 是有意义的,即使它更冗长。

【讨论】:

    【解决方案2】:

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

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

    依赖枚举数的底层数值似乎是个坏主意。

    【讨论】:

      【解决方案3】:

      这似乎类似于Boost.Tribool。 Tribool 支持转换为 bool 以用于条件语句,这似乎表明在这种情况下隐式转换为 bool 并不坏,至少根据 Boost 组织(我认为这是相当合理的)。

      【讨论】:

        【解决方案4】:

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

        例如你真正想要的地方是

        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,两者均非零,因此表示“成功”。

        【讨论】:

          猜你喜欢
          • 2011-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-09
          • 1970-01-01
          相关资源
          最近更新 更多