STL源码阅读小记(四)——Unique_ptr

本文详细剖析了STL中LLVM libc++13.0版本unique_ptr的独特之处,重点讲解了如何处理自定义析构函数的萃取,并通过实例展示了构造函数的复杂特性和enable_if技巧。理解了这些有助于填补智能指针的理解空白。
摘要由CSDN通过智能技术生成

前言

继续看stl中常用东西的源码,打算把智能指针的坑给填了,这次先写点unique_prt,下次写shared_ptr。unique_prt的代码总体而言比较简单,唯一稍微复杂的地方就是对自定义析构函数的萃取。

STL版本

本文所使用的stl版本为libc++ 13.0,属于LLVM项目。

LLVM项目Github

如果遇到不熟悉的宏定义可以参考文档Symbol Visibility Macros

Unique_ptr

依照惯例,来看一下定义的模板参数和一些typedef。

template <class _Tp, class _Dp = default_delete<_Tp> >
class _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr {
   
public:
  typedef _Tp element_type;
  typedef _Dp deleter_type;
  typedef _LIBCPP_NODEBUG_TYPE typename __pointer<_Tp, deleter_type>::type pointer;		//萃取是否有自定义的指针类型

  static_assert(!is_rvalue_reference<deleter_type>::value,
                "the specified deleter type cannot be an rvalue reference");
private:
  __compressed_pair<pointer, deleter_type> __ptr_;

第一个模板参数_Tp是我们要定义智能指针存储对象的类型,第二个模板参数_Dp则是析构函数的类型。默认的default_delete<_Tp>使用的是直接delete指针的方式。

__compressed_pair则是存储原始指针和析构函数的地方,具体我们稍后再说,先把大体看一遍,

__point是一个类型萃取,源码如下,简单来说就是pointer则是对_Dp进行类型萃取,判断_Dp是否自己定义了自己的point,如_Dp中定义了typedef point xxx,会萃取这个xxx。如果没有就会为_Tp*。

#define _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(NAME, PROPERTY)                \
    template <class _Tp, class = void> struct NAME : false_type {
      };    \
    template <class _Tp>               struct NAME<_Tp, typename __void_t<typename _Tp:: PROPERTY >::type> : true_type {
      }

// __pointer
_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_pointer, pointer);
template <class _Tp, class _Alloc,
          class _RawAlloc = typename remove_reference<_Alloc>::type,
          bool = __has_pointer<_RawAlloc>::value>
struct __pointer {
   
    using type _LIBCPP_NODEBUG_TYPE = typename _RawAlloc::pointer;
};
template <class _Tp, class _Alloc, class _RawAlloc>
struct __pointer<_Tp, _Alloc, _RawAlloc, false> {
   
    using type _LIBCPP_NODEBUG_TYPE = _Tp*;
};

不难看出,__pointer根据第四个模板参数进行选择性的特化,第四个模板参数__has_pointer是利用sfinae进行判断是否存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值