现在的位置: 首页 > 综合 > 正文

[vs 2005]_Ptr_cat

2013年12月13日 ⁄ 综合 ⁄ 共 2093字 ⁄ 字号 评论关闭
// 用于获取指针种类
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;
};

 

【上篇】
【下篇】

抱歉!评论已关闭.