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 "特性萃取机":
原文:https://www.cnblogs.com/dabai56/p/11432854.html