接上篇博客的图,我们可以看出当我们把迭代器或者原生指针放入萃取机的时候,萃取机会帮我们萃取出五中特性:value_type(类型)、还有difference_type(容器最大容量)、pointer(容器所指之物)、reference_type(所指对象内容)、iterator_category(迭代器型别)
1. 我们先谈一谈value_type,如何得到其value_type,我们都知道可以通过函数模板的参数推导机制来得到迭代器的value_type;
例如:tmplate<class T> void func(T t) {T tmp;} //得到了我们想要的value_type; void main() {int i; func(i);}
但是上述说法有点瑕疵,当我们传入的是int* 类型的参数时候,我们更希望能够,得到int 的类型,因为有int,我们自然而然可以得到int* ,此时我们的参数传导就有了问题,要使用模板的偏特化:
模板的偏特化: template<typename T> class C<T*>{T tem;} 这样我们可以看出通过偏特化可以得出int* 的类型是int ; 所以我们有两种:偏特化的和常规;
所以我们可以通过class 专门来萃取迭代器的特性之一:value_type;
现在我们来写一写:tmplate<class I> struct iterator_traits {typedef typename I :: value_type value_type;}
本质就是如果I有自己的特性那么我就将他萃取出来成value_type; template<class T> typename iterator_traits<T> :: value_type func(T ite) {return *ite;} // 这里的i是自己的value_type,我们传入的是迭代器;
同理,我们可以根据上面的论述,得到偏特化的萃取机从而使得原生指针可以被traits萃取出value_type;
2. difference_type:表示两个迭代器之间的距离,这个代码其实相比较来说,较好理解: 说白了就是一个循环计数;当然其也有偏特化版本。(原版+偏特化(const + 非const))
3. pointer(容器所指之物)* (Item*)
4. reference_type(所指对象内容)& (Item&) 这两个没啥说的,一个传回引用,一个传回指针;
5. iterator_category(迭代器型别) 复杂的大工程,我的好好查查资料,在写笔记,它涉及到好几个类的继承关系;
小仙女下班了,打电话去!