/* 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 */ #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); #endif return boost::report_errors(); }