#include<algorithm>
#include<iostream>
#include<vector>
template<class T>
void defaultfunc(T* p)
{
if (p)
delete(p);
}
template<class T,class D=decltype(defaultfunc<T>)*>
class myunique_ptr
{
public:
explicit myunique_ptr(T* p,D del= defaultfunc<T>) :ptr(p) ,delFunc(del){};
myunique_ptr(const myunique_ptr& up) = delete;
myunique_ptr& operator==(const myunique_ptr& up) = delete;
~myunique_ptr()
{
delFunc(ptr);
}
myunique_ptr(myunique_ptr&& up)
{
ptr= up.ptr;
up.ptr = 0;
}
myunique_ptr& operator=(myunique_ptr&& rhs)
{
swap(rhs);
return *this;
}
T operator* ()
{
return *ptr;
}
T operator-> ()
{
return &*(*this);
}
void swap(myunique_ptr& rhs)
{
std::swap(ptr, rhs.ptr);
}
void reset(T* p = 0);
T* release();
private:
T* ptr;
D delFunc;
};
template<class T,class D>
void myunique_ptr<T,D>::reset(T* p)
{
if (ptr != p)
if (ptr)
~myunique_ptr();
ptr = p;
}
template<class T,class D>
T* myunique_ptr<T,D>::release()
{
auto res = ptr;
ptr = 0;
return res;
}
int main()
{
{
auto delF = [](int* p)->void {if (p)delete p; std::cout << "del"<<std::endl; };
myunique_ptr<int>up(new int(21),delF);
myunique_ptr<int>tmp(new int(58));
up.swap(tmp);
auto p=tmp.release();
std::cout << *p<<std::endl;
}
system("pause");
return 0;
}
玩具版C++ 智能指针 unique_ptr的实现
最新推荐文章于 2022-10-21 11:23:52 发布