如何从类对象返回值?

Ter*_*kal 4 c++ class operator-overloading

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

MyClass a;
...
if (a)
    do_something();
Run Code Online (Sandbox Code Playgroud)

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

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

main()
    MyClass a;
    ...
    if (!a)
        do_something_different();
Run Code Online (Sandbox Code Playgroud)

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

小智 8

重载void*cast操作符:

operator void * () const { return some_condition; };
Run Code Online (Sandbox Code Playgroud)

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

if ( cin ) {
   // stream is OK
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Dacav我不知道你的男人更具体 - 一个void*不能成为算术表达式的一部分所以这个类不能以'a + 1`的形式使用,正如我所建议的那样可能是也可能不是OP想要. (2认同)

Kon*_*lph 6

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

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

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

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


sbk*_*sbk 5

很奇怪,到目前为止还没有人提到过安全的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
    }
  };
Run Code Online (Sandbox Code Playgroud)