c++ unique_ptr
#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";
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;
(*test).Data();
test->Data();
auto p = test.release();
if(p) {
delete p;
p = NULL;
}
return 0;
}