C++标准库 _Get_unwrapped

编译器: MSVC v142
所属文件: xutility
位置(行): 259
函数名称: _Get_unwrapped
函数描述: 获取当前迭代器的指针(指向容器中的某个元素的地址).

源码:

template , int> = 0>
_NODISCARD constexpr auto _Get_unwrapped(const _Iter& _It) {
    // unwrap an iterator previously subjected to _Adl_verify_range or otherwise validated
    return _It._Unwrapped();
}

 

模板条件拆解

_Unwrappable_v请看这里
_Unwrappable_v的目的是验证这个T是一个迭代器, 如果不是一个迭代器, 那么enable_if_t就没有::type这个属性, 所以强行调用就会失败, 从而跳过当前匹配.

template , int> = 0>enable_if_t别名拆解后如下,
template , int>::type = 0> 再拆解(看本质),
template 第二个模板参数是一个non-type, 也是一个匿名参数.
这种匿名参数的作用就是利用SFINAE规则去过滤掉一些不匹配的调用, 只为特定类型生成代码.

 

提取元素指针

_It._Unwrapped() 假设_It_Vector_const_iterator, 那么它的源码如下, _Unwrapped函数会返回当前对象的_Ptr指针,这是一个指向当前vector中的某个元素的指针.

template 
class _Vector_const_iterator : public _Iterator_base { // iterator for nonmutable vector
public:
    using pointer         = typename _Myvec::const_pointer;
    using _Tptr           = typename _Myvec::pointer;
    ...

    _NODISCARD pointer _Unwrapped() const {
        return _Ptr;
    }

    void _Seek_to(pointer _It) {
        _Ptr = _Const_cast(_It);
    }
    
    _Tptr _Ptr; // pointer to element in vector
    ...
}

你可能感兴趣的:(C++标准库 _Get_unwrapped)