輕盈曼妙,欲語還羞C++之: unique_ptr
阿新 • • 發佈:2018-12-10
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;
}