2010-07-07 116 views
21

我正在研究std::tr1::shared_ptr<>如何提供投射到布爾的能力。我想(大概是通過類型提升創建一個智能指針,可以鑄造到bool作爲平凡解,即shared_ptr <>如何安全地允許轉換爲bool?

operator bool() { 
    return m_Ptr!=0; 
} 

通常最終被隱式強制轉換爲指針類型時,過去被抓住了),這通常是不希望的。助推器和微軟的實施似乎都使用涉及鑄造到unspecified_bool_type()的技巧。任何人都可以解釋這種機制如何工作,以及如何防止隱式轉換爲基礎指針類型?

+0

所有優秀的答案,謝謝。很高興能夠給它起一個名字 - 沒有遇到過安全的布爾成語。 – 2010-07-07 10:24:20

回答

31

在問題中描述的技術是safe bool idiom

從C++ 11開始,這個習語就不再需要了。現代的解決問題的方法是使用explicit關鍵字上操作:

explicit operator bool() { 
    return m_Ptr != nullptr; 
} 
+0

呵呵,我知道安全的bool習慣用法,並且最近發現了'explicit'轉換運算符,但我不知道這個lil'null_ptr' thingy。謝謝:) – 2010-07-07 09:12:18

3

它通常返回的是一個成員指針。成員指針可以像bool一樣對待,但不支持bool所做的許多隱式轉換。

4

的訣竅是這樣的。您可以定義這一切你的智能指針類型的內部(在這種情況下,shared_ptr):

private: 

    struct Tester 
    { 
    Tester(int) {} // No default constructor 
    void dummy() {} 
    }; 

    typedef void (Tester::*unspecified_bool_type)(); 

public: 

    operator unspecified_bool_type() const 
    { 
    return !ptr_ ? 0 : &Tester::dummy; 
    } 

ptr_是智能指針類中的原生指針。

正如你所看到的,unspecified_bool_typetypedef到無法通過任何外部代碼訪問的類型,因爲Tester是一個私人結構。但調用代碼可以使用這種(隱式)轉換爲指針類型並檢查它是否爲空。在C++中,它可以用作bool表達式。

+0

## ModelId是怎麼回事? – kennytm 2010-07-07 08:55:30

+0

@KennyTM:對不起,剛剛刪除了。 – Gorpik 2010-07-07 08:55:58

+1

您需要爲'Tester :: unspecified_bool_type'提供'!='和'=='的實現,否則您將允許在類的實例之間進行無意義的比較編譯。 – 2010-07-07 08:59:59

相關問題