1. 程式人生 > >輕盈曼妙,欲語還羞C++之: unique_ptr

輕盈曼妙,欲語還羞C++之: unique_ptr

c++ unique_ptr

/*************************************************************************
	> File Name: unique_ptr_self.cpp
	> Author: XXDK
	> Email: [email protected] 
	> Created Time: Tue 18 Sep 2018 11:27:46 AM CST
 ************************************************************************/
#include<iostream> #include<cassert> using namespace std; template<typename T> struct DefaultDeleter { void operator()(T* p) { if (p) { delete p; p = NULL; } } }; template<typename T, typename Deleter = DefaultDeleter<T>> class unique_ptr { public: unique_ptr
(T* pt = NULL); ~unique_ptr(); private: unique_ptr(const unique_ptr&); unique_ptr& operator=(const unique_ptr &); public: void reset(T* p); T* release(); T* get(); public: operator bool() const; T& operator*(); T* operator->(); private: T* m_pT; Deleter m_deleter; void
del(); }; template<typename T, typename Deleter> unique_ptr<T, Deleter>::unique_ptr(T *pT):m_pT(pT){} template<typename T, typename Deleter> unique_ptr<T, Deleter>::~unique_ptr() { del(); } template<typename T, typename Deleter> void unique_ptr<T, Deleter>::del() { if(*this) { m_deleter(m_pT); m_pT = NULL; } } template<typename T, typename Deleter> T* unique_ptr<T, Deleter>::get() { return m_pT; } template<typename T, typename Deleter> T* unique_ptr<T, Deleter>::release() { T* p = m_pT; m_pT = NULL; return p; } template<typename T, typename Deleter> unique_ptr<T, Deleter>::operator bool() const { return NULL != m_pT; } template<typename T, typename Deleter> T& unique_ptr<T, Deleter>::operator*() { assert(*this); std::cout << "operator*\n"; return *m_pT; } template<typename T, typename Deleter> T* unique_ptr<T, Deleter>::operator->() { std::cout << "operator->\n"; /**< 1. *this => unique_ptr<Test>; * 2. *(*this) => operator*, aka *m_pT; * 3. &*(*this) => &(*m_pT) => m_pT */ //return m_pT; return &*(*this); } class Test { public: int data; Test() { std::cout << "Test ctor: " << this << std::endl; } ~Test() { std::cout << "Test dtor: " << this << std::endl; } int Data() { std::cout << "Test data: " << data << std::endl; } }; int main() { unique_ptr<Test> test(new Test); assert(test); test->data =100; ///< operator-> (*test).Data(); ///< operator* test->Data(); ///< operator-> auto p = test.release(); ///< self member func if(p) { delete p; p = NULL; } return 0; }