// 用于获取指针种类 template<class _T1, class _T2> inline typename _Ptr_cat_helper<_T1, _T2>::_Ptr_cat _Ptr_cat(_T1&, _T2&) { // 调用_Ptr_cat_helper模板进行参数推断,_Ptr_cat_helper有普通版本也有特化版本。 typename _Ptr_cat_helper<_T1, _T2>::_Ptr_cat _Cat; return (_Cat); } // 模板_Ptr_cat_helper template<class _T1, class _T2> struct _Ptr_cat_helper { // 普通版本的_Ptr_cat_helper模板调用_Ptr_cat_with_checked_cat_helper进行推断 typedef typename _Ptr_cat_with_checked_cat_helper<_T1, _T2, typename _Checked_iterator_category<_T1>::_Checked_cat, typename _Checked_iterator_category<_T2>::_Checked_cat>::_Ptr_cat _Ptr_cat; }; // 模板 _Ptr_cat_with_checked_cat_helper 和 三个偏特化 template<class _T1, class _T2, class _Checked_Cat1, class _Checked_Cat2> struct _Ptr_cat_with_checked_cat_helper { typedef _Nonscalar_ptr_iterator_tag _Ptr_cat; }; template<class _T1, class _T2, class _Checked_Cat1> struct _Ptr_cat_with_checked_cat_helper<_T1, _T2, _Checked_Cat1, _Range_checked_iterator_tag> { typedef typename _Ptr_cat_helper<_T1, typename _T2::_Inner_type>::_Ptr_cat _Ptr_cat; }; template<class _T1, class _T2, class _Checked_Cat2> struct _Ptr_cat_with_checked_cat_helper<_T1, _T2, _Range_checked_iterator_tag, _Checked_Cat2> { typedef typename _Ptr_cat_helper<typename _T1::_Inner_type, _T2>::_Ptr_cat _Ptr_cat; }; template<class _T1, class _T2> struct _Ptr_cat_with_checked_cat_helper<_T1, _T2, _Range_checked_iterator_tag, _Range_checked_iterator_tag> { typedef typename _Ptr_cat_helper<typename _T1::_Inner_type, typename _T2::_Inner_type>::_Ptr_cat _Ptr_cat; }; // 模板_Ptr_cat_helper的特化版本 template<class _T1> struct _Ptr_cat_helper<_T1, _Undefined_inner_type_tag> { typedef _Nonscalar_ptr_iterator_tag _Ptr_cat; }; template<class _T2> struct _Ptr_cat_helper<_Undefined_inner_type_tag, _T2> { typedef _Nonscalar_ptr_iterator_tag _Ptr_cat; }; template<> struct _Ptr_cat_helper<_Undefined_inner_type_tag, _Undefined_inner_type_tag> { typedef _Nonscalar_ptr_iterator_tag _Ptr_cat; }; // INTEGER FUNCTION _Ptr_cat template<> struct _Ptr_cat_helper<_Bool *, _Bool *> { // return pointer category from pointer to pointer arguments typedef _Scalar_ptr_iterator_tag _Ptr_cat; }; template<> struct _Ptr_cat_helper<const _Bool *, _Bool *> { // return pointer category from pointer to pointer arguments typedef _Scalar_ptr_iterator_tag _Ptr_cat; };