关于STL迭代器中Traits编程方法的学习总结

匿名 (未验证) 提交于 2019-12-02 23:56:01
迭代器的相应类型value_type,例:vector<int>::iterator it;迭代器it的类型实际为int *,而这里迭代器的相应类型是指int,,即这里迭代器的相应类型是指迭代对象的类型。
在使用迭代器时,有时可能需要使用迭代器的相应类型value_type,例如当某函数中使用迭代器,需要返回value_type类型的值,而此时我们只知道迭代器的类型,怎么获得该迭代器的value_type?
STL中解决该问题方法:
在STL中定义迭代器时,同时有声明内嵌类型value_type,即:
1 template <class T> 2 struct iterator { 3     typedef T value_type; //声明内嵌类型value_type 4     T *ptr; 5 };

这样在上述需求时可类似如下使用:

1 template <class I>  2 typename I::value_type //返回值类型 3 func_exp(I iter) { 4     return *iter; 5 }

但当原生指针作为迭代器时,我们无法为其声明内嵌类型 value_type,因为我们没有该迭代器的定义。

即出现两种情况,原生指针作为迭代器和自定义 class type 迭代器,获得其value_type时不可以同一种方法获得。

这时可使用 traits 编程技巧,可将其获取value_type独立出来,使用模板偏特化来解决上述两种不同情况:

1 template <class I> 2 struct iterator_traits { 3     typedef typename I::value_type value_type; 4 }; 5  6 template <class T> 7 struct iterator_traits<T*> { //为原生指针作为迭代器时特化版本 8     typedef T value_type; 9 };

这时再使用value_type时,如下,可解决原生指针获取value_type的问题:

1 template <class T>  2 iterator_traits<T>::value_type //返回值类型,使用iterator_traits推测value_type类型 3 func(T iter) { 4     return *iter; 5 }

traits "特性萃取机":

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!