Traits
1. iterator_traits —— “迭代器的特性(型别)萃取机”
标准迭代器都包括
iterator_category
,value_type
,difference_type
,pointer
,reference
五个内嵌型别(五个typedef
) (设计适当的相应型别, 是迭代器的责任。而设计适当的迭代器,则是容器的责任。)
以下代码摘自gcc v8.1.0
/**
* @brief Traits class for iterators.
*
* This class does nothing but define nested typedefs. The general
* version simply @a forwards the nested typedefs from the Iterator
* argument. Specialized versions for pointers and pointers-to-const
* provide tighter, more correct semantics.
*/
template<typename _Iterator>
struct iterator_traits
: public __iterator_traits<_Iterator> { };
/// Partial specialization for pointer types. 针对 指针类型 的偏特化版本
template<typename _Tp>
struct iterator_traits<_Tp*>
{
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef _Tp& reference;
};
/// Partial specialization for const pointer types. 针对 const指针 的偏特化版本
template<typename _Tp>
struct iterator_traits<const _Tp*>
{
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef const _Tp* pointer;
typedef const _Tp& reference;
};
上面代码中的 __iterator_traits
为:
template<typename _Iterator, typename = __void_t<> >
struct __iterator_traits { };
template<typename _Iterator>
struct __iterator_traits< _Iterator,
__void_t< typename _Iterator::iterator_category,
typename _Iterator::value_type,
typename _Iterator::difference_type,
typename _Iterator::pointer,
typename _Iterator::reference > >
{
typedef typename _Iterator::iterator_category iterator_category;
typedef typename _Iterator::value_type value_type;
typedef typename _Iterator::difference_type difference_type;
typedef typename _Iterator::pointer pointer;
typedef typename _Iterator::reference reference;
};
2. 用于确定类型、修改类型限定等:
列出去除cv限定符的代码如下:
/// remove_const
template<typename _Tp>
struct remove_const
{ typedef _Tp type; };
template<typename _Tp>
struct remove_const<_Tp const>
{ typedef _Tp type; };
/// remove_volatile
template<typename _Tp>
struct remove_volatile
{ typedef _Tp type; };
template<typename _Tp>
struct remove_volatile<_Tp volatile>
{ typedef _Tp type; };
/// remove_cv
template<typename _Tp>
struct remove_cv
{
typedef typename
remove_const<typename remove_volatile<_Tp>::type>::type type;
};
3. 详细讲解
TODO…