diff --git a/test/pointer_traits_test.cpp b/test/pointer_traits_test.cpp index 1455e87..368b19b 100644 --- a/test/pointer_traits_test.cpp +++ b/test/pointer_traits_test.cpp @@ -38,6 +38,8 @@ class CompleteSmartPtr { template friend class CompleteSmartPtr; + void unspecified_bool_type_func() const {} + typedef void (CompleteSmartPtr::*unspecified_bool_type)() const; public: #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) @@ -73,17 +75,32 @@ class CompleteSmartPtr T & operator *() const { return *ptr_; } + operator unspecified_bool_type() const + { return m_ptr? &CompleteSmartPtr::unspecified_bool_type_func : 0; } + template static CompleteSmartPtr static_cast_from(const CompleteSmartPtr &uptr) - { ++CompleteSmartPtrStats::static_cast_called; return CompleteSmartPtr(*static_cast(uptr.ptr_)); } + { + ++CompleteSmartPtrStats::static_cast_called; + element_type* const p = static_cast(uptr.ptr_); + return p ? CompleteSmartPtr(*p) : CompleteSmartPtr(); + } template static CompleteSmartPtr const_cast_from(const CompleteSmartPtr &uptr) - { ++CompleteSmartPtrStats::const_cast_called; return CompleteSmartPtr(*const_cast(uptr.ptr_)); } - + { + ++CompleteSmartPtrStats::const_cast_called; + element_type* const p = const_cast(uptr.ptr_); + return p ? CompleteSmartPtr(*p) : CompleteSmartPtr(); + } + template static CompleteSmartPtr dynamic_cast_from(const CompleteSmartPtr &uptr) - { ++CompleteSmartPtrStats::dynamic_cast_called; return CompleteSmartPtr(*dynamic_cast(uptr.ptr_)); } + { + ++CompleteSmartPtrStats::dynamic_cast_called; + element_type* const p = dynamic_cast(uptr.ptr_); + return p ? CompleteSmartPtr(*p) : CompleteSmartPtr(); + } friend bool operator ==(const CompleteSmartPtr &l, const CompleteSmartPtr &r) { return l.ptr_ == r.ptr_; } @@ -99,6 +116,8 @@ class CompleteSmartPtr template class SimpleSmartPtr { + void unspecified_bool_type_func() const {} + typedef void (SimpleSmartPtr::*unspecified_bool_type)() const; public: SimpleSmartPtr() @@ -127,6 +146,9 @@ class SimpleSmartPtr T & operator *() const { return *ptr_; } + operator unspecified_bool_type() const + { return ptr_? &SimpleSmartPtr::unspecified_bool_type_func : 0; } + private: T *ptr_; };