traits
这是用traits的详细用法https://www.cnblogs.com/tianzeng/p/9709814.html
/** * 用于标记迭代器类型 */ struct input_iterator_tag {}; struct output_iterator_tag {}; struct forward_iterator_tag : public input_iterator_tag {}; struct bidirectional_iterator_tag : public forward_iterator_tag {}; struct random_access_iterator_tag : public bidirectional_iterator_tag {}; /** * 用于traits出迭代其所指对象的型别 */ template <class Iterator> struct iterator_traits { // 迭代器类型, STL提供五种迭代器 typedef typename Iterator::iterator_category iterator_category; // 迭代器所指对象的型别 // 如果想与STL算法兼容, 那么在类内需要提供value_type定义 typedef typename Iterator::value_type value_type; // 这个是用于处理两个迭代器间距离的类型 typedef typename Iterator::difference_type difference_type; // 直接指向对象的原生指针类型 typedef typename Iterator::pointer pointer; // 这个是对象的引用类型 typedef typename Iterator::reference reference; }; /** * 针对指针提供特化版本 */ template <class T> struct iterator_traits<T*> { typedef random_access_iterator_tag iterator_category; typedef T value_type; typedef ptrdiff_t difference_type; typedef T* pointer; typedef T& reference; }; /** * 针对指向常对象的指针提供特化 */ template <class T> struct iterator_traits<const T*> { typedef random_access_iterator_tag iterator_category; typedef T value_type; typedef ptrdiff_t difference_type; typedef const T* pointer; typedef const T& reference; }; /** * 返回迭代器类别 */ template <class Iterator> inline typename iterator_traits<Iterator>::iterator_category iterator_category(const Iterator&) { typedef typename iterator_traits<Iterator>::iterator_category category; return category(); } /** * 返回表示迭代器距离的类型 */ template <class Iterator> inline typename iterator_traits<Iterator>::difference_type* distance_type(const Iterator&) { return static_cast<typename iterator_traits<Iterator>::difference_type*>(0); } /** * 返回迭代器所指对象的类型 */ template <class Iterator> inline typename iterator_traits<Iterator>::value_type* value_type(const Iterator&) { return static_cast<typename iterator_traits<Iterator>::value_type*>(0); }