traits思想
1.前提
目的:设计迭代器
分开实现list和list_iterator在使用时会暴露过多细节,所以STL容器都是都要实现自己的专属迭代器,以作更好的封装
2.迭代器的相应类型
- value type
- difference type
- pointer type
- reference type
- iterator category
3.存在的问题
1.C++中只有sizeof而没有typeof,如何创建迭代器所指值类型的对象(即如何获取其value_type)
- 解决方法时是template的参数推导机制

-参数推导机制,无法满足所有场景,上图中利用参数推导机制解决了参数传递问题,但是无法解决返回值类型问题- eg:实现一个解引用函数,通过上述方法无法获取迭代器所指类型
2.使用声明内嵌的方法
template <class T>
struct MyIter{typedef T value_type; //关键所在,nested type......
}template <class I>
typename I::value_type func(I iter){return *iter;
}
3.但是声明内嵌的方法不能解决原生指针的问题
- 原生指针可以作为迭代器
- 原生指针不是class type,无法定义内嵌类型
- eg:`int*`
4.使用偏特化
针对template参数进一步的条件限制所设计的一个特化版本
//泛化版本
template <class T>
class C {...};
//偏特化版本
template <class T>
class C<T*>{... };
5.traits思想
traits思想是综合
声明内嵌类型和偏特化之后的产物,目的是从迭代器中萃取出其相应类型
完整例子,其中const T*的偏特化未列出

6.萃取类型特性
-
前面所述都是对迭代器特性的萃取,现在我们要获取一些类型的特性
- 是否含有non-trivial default constructor
- 是都含有non-trivial copy constructor
- 等等。。。
-
目的是在一些函数的定义中对不同版本进行重载,使用时调用最合适的版本而不是使用if判断,较低效
-
具体使用如下:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
