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

迭代器的相应类型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 }

typename负责告诉编译器 I::value_type 为一个类型,因为 I 为模板类型,在模板被实例化前,编译器并不知道 I 是什么,也就不知道 I::value_type 表示类型。

但当原生指针作为迭代器时,我们无法为其声明内嵌类型 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 "特性萃取机":

扫描二维码关注公众号,回复: 7133983 查看本文章

猜你喜欢

转载自www.cnblogs.com/dabai56/p/11432854.html
今日推荐