test_shared_ptr.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 129 行
CPP
129 行
// (C) Copyright John Maddock 2005.// Use, modification and distribution are subject to the// Boost Software License, Version 1.0. (See accompanying file// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#ifdef TEST_STD_HEADERS#include <memory>#else#include <boost/tr1/memory.hpp>#endif#include <iostream>#include <boost/static_assert.hpp>#include <boost/type_traits/is_base_and_derived.hpp>#include <boost/type_traits/is_same.hpp>#include "verify_return.hpp"struct base{ char member();};struct derived : public base{};struct derived_deleter{ void operator()(derived*b) { delete b; }};struct abstract_base{ virtual ~abstract_base();};struct concrete : public abstract_base{};void noop(){}struct shared_self : public std::tr1::enable_shared_from_this<shared_self>{ typedef std::tr1::enable_shared_from_this<shared_self> base_type; shared_self() : base_type(){} shared_self(const shared_self& s) : base_type(s){} ~shared_self(){} // implicit assignment: //shared_self& operator=(const shared_self& s) //{ // return *this; //}};int main(){ // bad_weak_ptr: std::tr1::bad_weak_ptr b; BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::exception, std::tr1::bad_weak_ptr>::value)); // shared_ptr: typedef std::tr1::shared_ptr<derived> pderived; typedef std::tr1::shared_ptr<base> pbase; typedef std::tr1::shared_ptr<abstract_base> pabase; BOOST_STATIC_ASSERT((::boost::is_same<pderived::element_type, derived>::value)); pderived pd1; pabase pb1(new concrete()); pbase pb2(new derived(), derived_deleter()); pderived pd2(pd1); pbase pb3(pd1); std::tr1::weak_ptr<derived>* pweak = 0; pbase pb4(*pweak); std::auto_ptr<derived>* pap = 0; pbase pb5(*pap); pb2 = pb3; pb2 = pd1; pb2 = *pap; pb2.swap(pb3); pb2.reset(); pb1.reset(new concrete()); pb2.reset(new derived(), derived_deleter()); verify_return_type(pb2.get(), static_cast<base*>(0)); verify_return_type(*pb2, base()); verify_return_type(pb2->member(), char(0)); verify_return_type(pb2.use_count(), long(0)); verify_return_type(pb2.unique(), bool(0)); if(pb2) { noop(); } if(!pb3) { noop(); } if(pb2 && pb3) { noop(); } // heterogeneous compare: verify_return_type(pd1 == pb2, bool()); verify_return_type(pd1 != pb2, bool()); verify_return_type(pd1 < pb2, bool()); std::cout << pb1 << pb2 << std::endl; std::tr1::swap(pb2, pb3); swap(pb2, pb3); // ADL verify_return_type(std::tr1::static_pointer_cast<derived>(pb2), pderived()); verify_return_type(std::tr1::dynamic_pointer_cast<concrete>(pb1), std::tr1::shared_ptr<concrete>()); verify_return_type(std::tr1::const_pointer_cast<base>(std::tr1::shared_ptr<const base>()), std::tr1::shared_ptr<base>()); verify_return_type(std::tr1::get_deleter<derived_deleter>(pb2), static_cast<derived_deleter*>(0)); // weak_ptr: typedef std::tr1::weak_ptr<base> wpb_t; BOOST_STATIC_ASSERT((::boost::is_same<wpb_t::element_type, base>::value)); wpb_t wpb1; wpb_t wpb2(pd1); wpb_t wpb3(wpb1); std::tr1::weak_ptr<derived> wpd; wpb_t wpb4(wpd); wpb4 = wpb1; wpb4 = wpd; wpb4 = pd1; wpb4.swap(wpb1); wpb4.reset(); verify_return_type(wpb4.use_count(), long(0)); verify_return_type(wpb4.expired(), bool(0)); verify_return_type(wpb4.lock(), pb2); // enable_shared_from_this: typedef std::tr1::shared_ptr<shared_self> pshared_self; typedef std::tr1::shared_ptr<const shared_self> pcshared_self; pshared_self sf1(new shared_self()); pshared_self sf2(new shared_self(*sf1)); *sf2 = *sf1; pcshared_self csf(sf1); verify_return_type(sf1->shared_from_this(), sf1); verify_return_type(csf->shared_from_this(), csf);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?