网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
那么为什么要把这个pointer_traits
拿出来单独说明一下呢,因为类似之前的内存分配器一样,它是stl中某些容器的使用前提,在讲容器的时候,绕不开它,所以先把它搞清楚了有助于后续的学习和理解。
为什么要叫指针萃取器呢,我理解它类似于内存萃取器allocator_traits
,都是根据模板参数去得到某种类型,并且traits也有萃取的意思,所以我这里就叫指针萃取器了。
2. 指针萃取器源代码分析
类模板pointer_traits
在标准库中有两个版本,一个特化版本,一个非特化版本,源代码都在bits/ptr_traits.h
头文件中,当然实际使用的时候它是被包含在头文件memory
中的。
2.1 非特化pointer_traits
我们先分析一下非特化版本的源代码,如下:
//pointer\_traits类模板
template<typename \_Ptr>
struct pointer\_traits
{
private:
template<typename \_Tp>
using __element_type = typename \_Tp::element_type;
template<typename \_Tp>
using __difference_type = typename \_Tp::difference_type;
template<typename \_Tp, typename \_Up, typename = void>
struct \_\_rebind : \_\_replace\_first\_arg<\_Tp, \_Up> {
};
//如果\_\_void\_t参数里面类型存在则直接使用下面这个结构体,否则使用上面那个
template<typename \_Tp, typename \_Up>
struct \_\_rebind<_Tp, _Up, __void_t<typename \_Tp::template rebind<_Up>>>
{
using type = typename \_Tp::template rebind<_Up>; };
public:
using pointer = _Ptr;
using element_type
= __detected_or_t<__get_first_arg_t<_Ptr>, _
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
T行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**