【问题标题】:Converting custom integer wrapper to boolean将自定义整数包装器转换为布尔值
【发布时间】:2014-01-20 12:35:50
【问题描述】:

假设我有一个围绕原始 C++ 类型的自定义包装器:

class myInt
{
    public:
        /*stuff here*/
    private:
        unsigned int data;
}

我该怎么做

myInt mi;  
if(mi){...}  

以您期望的普通整数的方式表现?
我能想到的就是写一个显式的布尔转换,或者可能覆盖 operator==。
类似的东西:

if(bool(mi)){...}
if(mi.toBool()){...}
if(mi==true){..}

所有这些都可以达到目的,但看起来很丑陋和做作。
我还有其他选择吗?

【问题讨论】:

    标签: c++ boolean type-conversion wrapper


    【解决方案1】:

    最好的选择是完全放弃包装器。

    【讨论】:

      【解决方案2】:

      您可以制作以下演员表操作符,例如:

      class myInt
      {
          public:
              operator bool() const { return data != 0; }
      
          private:
              unsigned int data;
      }
      

      默认情况下它是隐式的(这意味着每次编译器发现它确实需要一个 bool 并且您提供了一个 myInt 时都会使用它)。从 c++11 开始,您可以将其标记为显式,强制将用法限制为显式转换,在此之前它始终是隐式的。

      但您应该注意,这通常是一个坏主意,应该避免:查看the safe bool idiom 了解更多讲座。

      另一个接近您的愿望且更安全的选项是! 运算符的重载:

      class myInt
      {
          public:
              bool operator!() const { return data == 0; }
      
          private:
              unsigned int data;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-03
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        相关资源
        最近更新 更多