迭代器的相应类型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 查看本文章