The Safe Bool Idiom學習
阿新 • • 發佈:2018-11-04
找到原作者的連線,很多程式碼無法執行,以下是修改後,在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){}