/* Copyright 2017-2018 Glen Joseph Fernandes (glenjofe@gmail.com) Distributed under the Boost Software License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) */ #include #include template class P1 { public: explicit P1(T* p) : p_(p) { } T* operator->() const BOOST_NOEXCEPT { return p_; } private: T* p_; }; template class P2 { public: explicit P2(T* p) : p_(p) { } P1 operator->() const BOOST_NOEXCEPT { return p_; } private: P1 p_; }; #if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION) template class P3 { public: explicit P3(T* p) : p_(p) { } T* get() const BOOST_NOEXCEPT { return p_; } private: T* p_; }; namespace boost { template struct pointer_traits > { static T* to_address(const P3& p) BOOST_NOEXCEPT { return p.get(); } }; } /* boost */ template class P4 { public: explicit P4(T* p) : p_(p) { } T* operator->() const BOOST_NOEXCEPT { return 0; } T* get() const BOOST_NOEXCEPT { return p_; } private: int* p_; }; namespace boost { template struct pointer_traits > { static T* to_address(const P4& p) BOOST_NOEXCEPT { return p.get(); } }; } /* boost */ #if !defined(BOOST_NO_CXX11_POINTER_TRAITS) template class P5 { public: explicit P5(T* p) : p_(p) { } T* get() const BOOST_NOEXCEPT { return p_; } private: T* p_; }; namespace std { template struct pointer_traits > { static T* to_address(const P5& p) BOOST_NOEXCEPT { return p.get(); } }; } /* std */ template class P6 { public: explicit P6(T* p) : p_(p) { } T* get() const BOOST_NOEXCEPT { return p_; } private: T* p_; }; namespace boost { template struct pointer_traits > { static T* to_address(const P6& p) BOOST_NOEXCEPT { return p.get(); } }; } /* boost */ namespace std { template struct pointer_traits > { static T* to_address(const P6& p) BOOST_NOEXCEPT { return 0; } }; } /* std */ #endif #endif int main() { int i = 0; BOOST_TEST(boost::to_address(&i) == &i); int* p = &i; BOOST_TEST(boost::to_address(p) == &i); P1 p1(&i); BOOST_TEST(boost::to_address(p1) == &i); P2 p2(&i); BOOST_TEST(boost::to_address(p2) == &i); #if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION) P3 p3(&i); BOOST_TEST(boost::to_address(p3) == &i); P4 p4(&i); BOOST_TEST(boost::to_address(p4) == &i); #if !defined(BOOST_NO_CXX11_POINTER_TRAITS) P5 p5(&i); BOOST_TEST(boost::to_address(p5) == &i); P6 p6(&i); BOOST_TEST(boost::to_address(p6) == &i); #endif #endif return boost::report_errors(); }