繁体   English   中英

如何从类对象返回值?

[英]How can I return a value from a class object?

是否有可能让类对象返回true / false值,所以我可以这样做:

MyClass a;
...
if (a)
    do_something();

我可以通过重载来完成(几乎)我想要的东西! 运营商:

class MyClass {
    ...
    bool operator!() const { return !some_condition; };
    ...
}

main()
    MyClass a;
    ...
    if (!a)
        do_something_different();

但我还没有找到一种方法来重载什么是“空”运算符。 当然,使用==运算符检查true / false也是可能的,事实上我到目前为止一直在做。

重载void * cast操作符:

operator void * () const { return some_condition; };

这就是流的工作原理,让你说:

if ( cin ) {
   // stream is OK
}

使用void *而不是bool可以防止在某些情况下错误地使用强制转换,例如算术,这是不可取的。 当然,除非您想在这些环境中使用它。

显而易见的解决方案 - 通过operator bool提供对bool的隐式转换 - 是一个坏主意。

这就是标准库使用operator void* ,如Neil的回答所示。

然而,值得指出的是,即使这种解决方案也存在缺陷,因此不再被认为是安全的。 不幸的是,想出一个更好的解决方案并非易事......

在Artima上有一篇文章描述了安全的bool成语 对于一个真正的库,这绝对是要走的路,因为它提供了最难以使用的最强大的界面。

很奇怪,到目前为止还没有人提到过安全的bool成语 到目前为止所描述的所有其他解决方案都有缺点(您可能会或可能不会关心),所有这些方法都在本文中进行了描述。 简而言之,安全bool成语是这样的:

  class Testable {
    typedef void (Testable::*bool_type)() const;
    void this_type_does_not_support_comparisons() const {}
  public:
    operator bool_type() const {
      return /* condition here */ ? 
        &Testable::this_type_does_not_support_comparisons  // true value
        : 0; // false value
    }
  };

尝试重载(bool)运算符:

operator bool() { /* ... */ }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM