-
结论:算法看不到容器,它所需的信息来源于迭代器;算法通常需要传入一个操作范围,而iterator_traits就是无论传入算法的是某种容器迭代器class还是原始指针,都能正确的获得各种类型声明,供算法使用
-
traits有很多种:type traits,iterator traits,char traits,alloctor traits,array traits,下面以iterator_traits举例:
STL的每种容器迭代器class都包含5个typedef,以便算法使用,下面以value_type举例。当一个算法需要知道 I 的value_type时:
template<typanema I,...>
void algorithm {
//例如I是list_iterator class,而list_iterator class中能找到该类型迭代器的value_type对应什么类型
typedef I::value_type value_type; //当I是T*或const T*时,找不到对应的value_type
//但如果I是普通指针,而不是某种容器的迭代器class,自然就没法找到对应的value_type的typedef
//为了满足这两种情况,设计一个iterator_traits class,根据传入的是list_iterator类型还是指针类型,调用对应的版本,得到对应的value_type
typename iterator_traits<I>::value_type v1;//根据传入萃取机的I的类型,调用不同版本
}
萃取机:Iterator_traits
//泛化版本
template<class I>
struct iterator_traits {
//传入的是某种容器的迭代器class,进入这个版本
typedef typename I::value_type value_type;
}
//两个偏特化版本
template<class T>
struct iterator_traits<T*> {
//传入T*,进入该版本
typedef T value_type;
}
template<class T>
struct iterator_traits<const T*> {
//传入const T*,进入该版本
typedef T value_type;
}