【unique_ptr的简易实现】

 标准库的源码有一千来行,我就写个80几行的缩水版好了

//默认删除器
template <typename Tp> struct default_delete{
  constexpr default_delete( void ) noexcept = default;
//支持隐式转换
  template <typename Up> requires std::convertible_to<Up *, Tp *>
//通用转发构造  
default_delete(const default_delete<Up>& ) noexcept {}
//类型萃取,函数体内不做任何事情
  void operator()(Tp *ptr) const{
//类型完整性静态断言检查
  	static_assert(!std::is_void<Tp>::value || sizeof(Tp)>0 );
  	delete ptr;
  }
};
//数组特化
template <typename Tp> struct default_delete<Tp[]>{
  constexpr default_delete(void) noexcept = default;
  template <typename Up> requires std::convertible_to<Up(*)[], Tp(*)[]>
  default_delete(const default_delete<Up[]>&) noexcept {}
  template<typename Up>
  typename std::enable_if<std::is_convertible<Up(*)[], Tp(*)[]>::value>::type
  operator()(Up* ptr) const{
  	static_assert(sizeof(Tp)>0);
  	delete [] ptr;
  }
};
template <typename Tp, typename Dp = default_delete<Tp>>
class unique_ptr{
  private: Tp *ptr{nullptr};
//全特化友元声明
  template <typename UTp, typename UDp>
  friend class unique_ptr;
  public:
  constexpr unique_ptr(void) noexcept = default;
  unique_ptr(Tp *p) : ptr(p) {}
//nullptr的支持
  unique_ptr(std::nullptr_t) {}
  ~unique_ptr(void){
	if(ptr) Dp{}(ptr);
  }
//弃置拷贝
  unique_ptr(unique_ptr const &) = delete;
  unique_ptr& operator=(unique_ptr const&) = delete;
//隐式转换的移动语义
  template <typename UTp, typename UDp>
	requires std::convertible_to<Tp *, UTp *> && std::same_as<Dp, UDp>
  unique_ptr(unique_ptr<UTp, UDp>&& other)
  { ptr = std::exchange(other.ptr, nullptr); }
  unique_ptr& operator=(unique_ptr&& other){
  	if(this != &other) {
		if(ptr) {
			Dp{}(ptr);
			ptr = std::exchange(other.ptr, nullptr);
		}
	}
	return *this;
  }
  Tp *get(void) const{
  	return ptr;
  }
  Tp *release(void) {
  	return std::exchange(ptr, nullptr);
  }
  void reset(Tp* p = nullptr) {
  	if(ptr) Dp{}(ptr);
  	ptr = p;
  }
  Tp *operator->() const{
  	return ptr;
  }
  Tp& operator*() const{
  	return *ptr;
  }
};
//数组重载
template <typename Tp, typename Dp>
//主模板递归继承 基类取得模式
class unique_ptr<Tp[], Dp>: unique_ptr<Tp, Dp>{};

template <typename Tp, typename... Args>
//延时接口
unique_ptr<Tp> make_unique(Args&&... args){
	return unique_ptr<Tp>(new Tp(std::forward<Args>(args)...));
}
//重载版本
template <typename Tp>
unique_ptr<Tp> make_unique(void){
	return unique_ptr<Tp>(new Tp);
}

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值