为什么需要有traits萃取器
- 给你一个迭代器对象(非类型),你需要得到它所指代的value_type(迭代器内需要统一设置typename成员)
- 迭代器可能是一个类(class type),也可能只是原生指针。但是用户写的代码不需要对迭代器的类别进行区分。(专门把萃取操作封装一个traits类的动机)
萃取过程
- 先制定一个约定,所有的迭代器类需要在类内定义一些元数据类型(value_type, difference_type, pointer, reference, iterator_category)
- 定义一个范型萃取类
template <class I>
struct iterator_traits {
typedef typename I::iterator_category iterator_category;
typedef typename I::value_type value_type;
...
};
template <class I>
struct iterator_traits <I*>{
typedef T value_type;
};
- 萃取!
template <class I>
typename iterator_traits<I>::value_type
func(I ite)
{
return *ite;
}