30 lines
		
	
	
		
			600 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			30 lines
		
	
	
		
			600 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#ifndef PIMPL_H_HPP_
							 | 
						||
| 
								 | 
							
								#define PIMPL_H_HPP_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <memory>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// opaque implementation type with perfect forwarding of constructor arguments
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// see pimpl_impl.hpp for the out-of-line definitions of the members and lifetime management
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// thanks to Herb Sutter (http://herbsutter.com/gotw/_101/) for the implementation
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								template<typename T>
							 | 
						||
| 
								 | 
							
								class pimpl
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								  std::unique_ptr<T> m_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								  pimpl ();
							 | 
						||
| 
								 | 
							
								  template<typename ...Args> pimpl (Args&& ...);
							 | 
						||
| 
								 | 
							
								  ~pimpl ();
							 | 
						||
| 
								 | 
							
								  T * operator -> ();
							 | 
						||
| 
								 | 
							
								  T const * operator -> () const;
							 | 
						||
| 
								 | 
							
								  T& operator * ();
							 | 
						||
| 
								 | 
							
								  T const& operator * () const;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |