如何从类对象返回值?

时间:2010-08-08 12:11:53

标签: c++ class operator-overloading

是否可以让类对象返回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也是可能的,实际上是我到目前为止所做的。

4 个答案:

答案 0 :(得分:8)

重载void * cast操作符:

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

这就是流的工作方式,让您说:

if ( cin ) {
   // stream is OK
}

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

答案 1 :(得分:6)

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

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

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

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

答案 2 :(得分:5)

很奇怪,到目前为止还没有人提到safe bool idiom。到目前为止所描述的所有其他解决方案都有缺点(您可能会或可能不会关心),所有这些方法都在本文中进行了描述。简而言之,安全的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
    }
  };

答案 3 :(得分:-1)

尝试重载(bool)运算符:

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