C++标准库 _Get_unwrapped_n

编译器: MSVC v142
所属文件: xutility
位置(行): 377
函数名称: _Get_unwrapped_n
函数描述:
尝试提取迭代器的_Ptr, 如果迭代器没有_ptr则原封不动的返回这个迭代器

源码:

template <class _Iter, class _Diff,
    enable_if_t<
        !_Unwrappable_for_unverified_v<_Iter> //
            && ((!_Unwrappable_for_offset_v<_Iter> && is_integral_v<_Diff>) || is_same_v<_Diff, _Distance_unknown>),
        int> = 0>
_NODISCARD constexpr const _Iter& _Get_unwrapped_n(const _Iter& _It, _Diff) {
    // pass through lvalue iterator that doesn't participate in checking
    return _It;
}

 

拆分理解

  • _Unwrappable_for_unverified_v

    template <class _Iter>
    _INLINE_VAR constexpr bool _Unwrappable_for_unverified_v = _Unwrappable_v<_Iter>&& _Do_unwrap_when_unverified_v<_Iter>;
    

    _Unwrappable_v 验证模板参数是不是一个Iterator.
    _Do_unwrap_when_unverified_v 判断是否可以执行_Unwrapped函数.

    vector<int> a {1, 2, 3, 4, 5};
    vector<int> b {};
    auto start_iter = a.begin();        // 生成一个 iterator: _Vector_iterator
    auto back_iter = back_inserter(b);  // 生成一个 iterator: back_insert_iterator
    
    // Debug 模式
    cout << _ITERATOR_DEBUG_LEVEL << endl;  // 2
    cout << _Unwrappable_for_unverified_v<decltype(start_iter)> << endl; // false
    cout << _Unwrappable_for_unverified_v<decltype(back_iter)> << endl;  // false
    
    // Release 模式
    cout << _ITERATOR_DEBUG_LEVEL << endl;  // 0
    cout << _Unwrappable_for_unverified_v<decltype(start_iter)> << endl; // true
    cout << _Unwrappable_for_unverified_v<decltype(back_iter)> << endl;  // false
    

    这个测试代码说明,当编译模式是Debug时, beginback_inserter生成的iterator都是不允许在未验证_Verify_range的情况下调用iterator_Unwrapped函数. 当编译模式是Release时, begin生成的iterator允许在未验证_Verify_range的情况下调用iterator_Unwrapped函数, 而back_inserter则不可以.
    备注: 这里说的不允许, 并不是真的不能调用, 而是做模板判断的时候, 它会过滤掉当前筛选.

  • _Unwrappable_for_offset_v

    template <class _Iter>
    _INLINE_VAR constexpr bool _Unwrappable_for_offset_v = _Unwrappable_v<_Iter>&& _Offset_verifiable_v<_Iter>;
    

    _Unwrappable_v 验证模板参数是不是一个Iterator.
    _Offset_verifiable_v 判断是否可以执行 _Verify_offset 函数.

  • is_integral_v

    // determine whether cv-unqualified type _Ty is integral
    template <class _Ty>
    _INLINE_VAR constexpr bool _Is_integral = _Is_any_of_v<_Ty, bool, char, signed char, unsigned char, wchar_t, 
                                                           char16_t, char32_t, short, unsigned short, int, unsigned int, 
                                                           long, unsigned long, long long, unsigned long long>;
    
    template <class _Ty>
    _INLINE_VAR constexpr bool is_integral_v = _Is_integral<remove_cv_t<_Ty>>;
    

    判断一个type是不是一个数字类型.

  • is_same_v

    template <class, class>
    _INLINE_VAR constexpr bool is_same_v = false; // determine whether arguments are the same type
    
    template <class _Ty>
    _INLINE_VAR constexpr bool is_same_v<_Ty, _Ty> = true;
    

    如果第一个类型参数和第二个类型参数相同, 则会匹配到template <class _Ty> _INLINE_VAR constexpr bool is_same_v<_Ty, _Ty> = true; 这个特化版本, 表示true.
    如果第一个类型参数和第二个类型参数不同, 则会跳过第一个匹配, 命中template <class, class> _INLINE_VAR constexpr bool is_same_v = false; 这个标准模板, 表示false.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容