traits如何萃取出iterator特性

         接上篇博客的图,我们可以看出当我们把迭代器或者原生指针放入萃取机的时候,萃取机会帮我们萃取出五中特性: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(迭代器型别)  复杂的大工程,我的好好查查资料,在写笔记,它涉及到好几个类的继承关系;

        小仙女下班了,打电话去!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值