忽略了释放函数的,但是不妨碍理解主要实现
template<typename Ty, typename Dy = nullptr_t>
class MyUniquePtr
{
typedef typename Ty* MyPointer;
typedef typename Dy MyDeleter;
typedef MyUniquePtr<Ty, Dy> MyObj;
private:
MyPointer m_ptPointer;
MyDeleter m_deleter;
public:
MyUniquePtr() : m_ptPointer(nullptr) {};
MyUniquePtr(MyPointer p) :m_ptPointer(p) {};
MyUniquePtr(const MyObj& other) = delete;
MyUniquePtr& operator= (const MyObj& other) = delete;
MyUniquePtr(MyUniquePtr&& other)
{
this->m_ptPointer = other.m_ptPointer;
this->m_deleter = other.m_deleter;
other.m_ptPointer = nullptr;
other.m_deleter = nullptr;
};
MyUniquePtr& operator=(MyObj&& other)
{
this->m_ptPointer = other.m_ptPointer;
this->m_deleter = other.m_deleter;
other.m_ptPointer = nullptr;
other.m_deleter = nullptr;
return *this;
}
~MyUniquePtr() { free();}
MyPointer get() { return m_ptPointer; }
MyDeleter get_deleter() { return m_deleter; };
MyPointer release()
{
auto pTemp = m_ptPointer;
m_ptPointer = nullptr;
return pTemp;
}
void reset(MyPointer p = nullptr)
{
free();
m_ptPointer = p;
}
void swap(MyObj& other)
{
auto ptPointer_Temp = other.get();
auto deleter_Temp = other.get_deleter();
other.m_ptPointer = get();
other.m_deleter = get_deleter();
m_ptPointer = ptPointer_Temp;
m_deleter = deleter_Temp;
}
MyPointer operator->() { return m_ptPointer; }
operator bool() { return m_ptPointer != nullptr; }
private:
void free()
{
if (m_ptPointer != nullptr)
{
delete m_ptPointer;
m_ptPointer = nullptr;
}
}
};