1. 程式人生 > >The Safe Bool Idiom學習

The Safe Bool Idiom學習

找到原作者的連線,很多程式碼無法執行,以下是修改後,在vs2015下執行通過的程式碼: 

/*
The Safe Bool Idiom
by Bjorn Karlsson
https://www.artima.com/cppsource/safebool3.html
*/
class safe_bool_base {
public:
    void this_type_does_not_support_comparisons() const {}
protected:
    typedef void (safe_bool_base::*bool_type)() const;  // define class const member pointer
    
    safe_bool_base() {}
    safe_bool_base(const safe_bool_base&) {}
    safe_bool_base& operator=(const safe_bool_base&) { return *this; }
    ~safe_bool_base() {}
};

template <typename T = void> 
class safe_bool :public safe_bool_base {
public:
    operator bool_type() const { // 過載返回基類const 成員指標型別
        return (static_cast<const T*>(this))->boolean_test() ?
            &safe_bool_base::this_type_does_not_support_comparisons : 0;

    }
protected:
    ~safe_bool() {}
};

template<> class safe_bool<void> : public safe_bool_base { // 對 void 型別進行特化
public:
    operator bool_type() const {
        return boolean_test() == true ?
            &safe_bool_base::this_type_does_not_support_comparisons : 0;
    }
protected:
    virtual bool boolean_test() const = 0;
    virtual ~safe_bool() {}
};


template <typename T, typename U> // 錯誤處理, 禁止 == 操作
void operator==(const safe_bool<T>& lhs, const safe_bool<U>& rhs) {
    lhs.this_type_does_not_support_comparisons();
    return false;
}

template <typename T, typename U> // 錯誤處理  禁止 != 操作 
void operator!=(const safe_bool<T>& lhs, const safe_bool<U>& rhs) {
    lhs.this_type_does_not_support_comparisons();
    return false;
}

// use  派生類必須實現 boolean_test 函式
class Testable_without_virtual : private safe_bool<Testable_without_virtual> {
public:

    //在此處使用using,目的:告知編譯器,當前類使用safe_bool過載後的 bool_type,而不是引用基類bool_type型別的定義。
    using safe_bool<Testable_without_virtual>::operator bool_type;
    bool boolean_test() const {
        return true;
    }
};

 

測試: 


 

// 
    Testable_without_virtual twv, twv2;
    if (twv)
    {
        std::cout << "twv:" << std::endl;
    }
    std::cout << "safe bool test: " << i << std::endl;

    if (twv == twv2) {}
    if(twv != twv2){}