traits思想

1.前提

目的:设计迭代器
分开实现listlist_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判断,较低效

  • 具体使用如下:

在这里插入图片描述


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部