【问题标题】:Test a C++ object validity as though it was a pointer测试 C++ 对象的有效性,就像它是一个指针一样
【发布时间】:2015-02-05 16:51:04
【问题描述】:

假设我有一个可能没有正确初始化的对象,但它不仅仅是一个指向对象的空指针;它是一个具有空或未初始化成员的对象。但我想以一种可读的方式检查它,就好像它是一个指针:

if (Object) use(Object);

例如,Object 可能有一个int 字段,如果该字段为0,则认为该字段未初始化。然后,我可以使 !像这样的运算符:

bool operator!() const {return intField == 0;}

我可以这样使用它:

if (! Object)  initialize (Object);

问题是,如果我想测试相反的条件(非空性),我不能这样做:

if (Object)...

我只发现尴尬的可能性:

if (! (! Object))...  // awful
if (Object.notNull()) // not so bad

最接近我愿望的是令人困惑:

bool operator()() {return intField != 0;}
if (Object())...   // it looks a lot like an argument-less constructor

AFAIK,没有返回 bool 的空运算符(类似于 bool operator() {...})或任何其他技巧或成语可以实现这一点。

除了notNull() 方法之外,还有什么可读的解决方案吗?谢谢。

【问题讨论】:

    标签: c++ object null operator-overloading operators


    【解决方案1】:

    您可以提供类型转换运算符,以允许转换为bool

    explicit operator bool() const {return intField != 0;}
    

    这允许它在布尔上下文中使用,例如if 条件。 explicit 是可选的,但它是防止转换为数字类型的潜在混淆的好主意。

    另一种方法是使用Boost.Optional 或类似方法,使任何类型都可以为空。

    【讨论】:

      【解决方案2】:

      我认为您应该小心使用运算符重载来指示有效性或初始化状态 - 特别是如果您将持有指向此类型对象的指针或引用。

      对于这种情况,我建议使用以下显式表示法:

      if (Object.isValid()) use(Object);
      

      这样,下一个阅读您的代码的人可以清楚地看到您在此处所做的事情。运算符重载对使用它的人来说应该是显而易见的,对一个对象的真/假检查意味着它存在与否,不一定是有效与否。

      【讨论】:

      • 我半同意,因为代码应该尽可能清晰。但是,另一方面,重载运算符在很大程度上是关于从概念上处理对象,如果您习惯于编写(或至少阅读)if (pointer) 以测试 pointer 不为空,您可能会发现 @987654324 @ 在概念上很清楚。这是在清晰、冗长和概念充分性之间找到良好平衡的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2022-08-18
      • 1970-01-01
      • 2020-04-25
      • 2018-09-30
      • 1970-01-01
      相关资源
      最近更新 更多