編譯器: MSVC v142
所屬文件: xutility
位置(行): 259
函數(shù)名稱:_Get_unwrapped
函數(shù)描述: 獲取當前迭代器的指針(指向容器中的某個元素的地址).
源碼:
template <class _Iter, enable_if_t<_Unwrappable_v<_Iter>, 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 <class _Iter, enable_if_t<_Unwrappable_v<_Iter>, int> = 0>
將enable_if_t
別名拆解后如下,
template <class _Iter, typename enable_if<_Unwrappable_v<_Iter>, int>::type = 0>
再拆解(看本質),
template <class _Iter, typename bool = 0>
第二個模板參數(shù)是一個non-type
, 也是一個匿名參數(shù).
這種匿名參數(shù)的作用就是利用SFINAE
規(guī)則去過濾掉一些不匹配的調用, 只為特定類型生成代碼.
?
提取元素指針
_It._Unwrapped()
假設_It
是 _Vector_const_iterator
, 那么它的源碼如下, _Unwrapped
函數(shù)會返回當前對象的_Ptr
指針袭景,這是一個指向當前vector
中的某個元素的指針.
template <class _Myvec>
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
...
}