萃取机:iterator_traits

  • 结论:算法看不到容器,它所需的信息来源于迭代器;算法通常需要传入一个操作范围,而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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jiuri1005/article/details/114575063