forked from boostorg/smart_ptr
		
	
		
			
	
	
		
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								////
							 | 
						||
| 
								 | 
							
								Copyright 2002, 2003, 2015, 2017, 2019 Peter Dimov
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Distributed under 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
							 | 
						||
| 
								 | 
							
								////
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[#enable_shared_from]
							 | 
						||
| 
								 | 
							
								# enable_shared_from
							 | 
						||
| 
								 | 
							
								:toc:
							 | 
						||
| 
								 | 
							
								:toc-title:
							 | 
						||
| 
								 | 
							
								:idprefix: enable_shared_from_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Description
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`enable_shared_from` is used as a base class that allows a `shared_ptr` or a
							 | 
						||
| 
								 | 
							
								`weak_ptr` to be obtained given a raw pointer to the object, by using the
							 | 
						||
| 
								 | 
							
								functions `shared_from` and `weak_from`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`enable_shared_from` differs from `enable_shared_from_this<T>` by the fact
							 | 
						||
| 
								 | 
							
								that it's not a template, and is its recommended replacement for new code.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								#include <boost/smart_ptr/enable_shared_from.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/shared_ptr.hpp>
							 | 
						||
| 
								 | 
							
								#include <cassert>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Y: public boost::enable_shared_from
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    boost::shared_ptr<Y> f()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return boost::shared_from( this );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    boost::shared_ptr<Y> p(new Y);
							 | 
						||
| 
								 | 
							
								    boost::shared_ptr<Y> q = p->f();
							 | 
						||
| 
								 | 
							
								    assert(p == q);
							 | 
						||
| 
								 | 
							
								    assert(!(p < q || q < p)); // p and q must share ownership
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Synopsis
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`enable_shared_from` is defined in `<boost/smart_ptr/enable_shared_from.hpp>`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  class enable_shared_from: public enable_shared_from_this<enable_shared_from>
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class T> shared_ptr<T> shared_from( T * p );
							 | 
						||
| 
								 | 
							
								  template<class T> weak_ptr<T> weak_from( T * p ) noexcept;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								template<class T> shared_ptr<T> shared_from( T * p );
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								[none]
							 | 
						||
| 
								 | 
							
								* {blank}
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								Returns:: `shared_ptr<T>( p\->enable_shared_from::shared_from_this(), p )`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NOTE: Throws `bad_weak_ptr` when `p` is not owned by a `shared_ptr`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								template<class T> weak_ptr<T> weak_from( T * p ) noexcept;
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								[none]
							 | 
						||
| 
								 | 
							
								* {blank}
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								Returns:: `weak_ptr<T>( p\->enable_shared_from::weak_from_this(), p )`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NOTE: Unlike `shared_from(this)`, `weak_from(this)` is valid in a destructor
							 | 
						||
| 
								 | 
							
								      and returns a `weak_ptr` that is `expired()` but still shares ownership
							 | 
						||
| 
								 | 
							
								      with other `weak_ptr` instances (if any) that refer to the object.
							 |