簡體   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