博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
traits编程技法
阅读量:6148 次
发布时间:2019-06-21

本文共 1091 字,大约阅读时间需要 3 分钟。

  看了《stl源码剖析》中关于traits的部分,由于对模板还不是很熟悉,就看了一下还未完工的感觉收获很大,推荐一下。

  在使用迭代器时,为了知道它的相应类型,可以使用模板的参数推导,代码如下

template 
struct MyItertypedef T value_type; T* ptr;MyIter(T* p=0) : ptr(p) { }T& operator*() const { return *ptr; }// ...};template
typename I::value_type // 返回类型func(I ite){ return *ite; }// ...MyIter
ite(new int(8));cout << func(ite); // 输出:8

 用typename是因为I::value_type要在模板实例化的时候才能知道是不是一个类型,所以用typename声明为类型。具体可见我前面提到的那篇文章,说得很详细。

  但是这样有一个问题,有些迭代器(比如指针)并不是一个类,也就用不了这个办法了。这时就要用traits思想把相应的类型萃取出来。

原始的类模板如下:

template 
struct iterator_traits { typedef typename I::value_type value_type;};

偏特化:

template 
struct iterator_traits
{ typedef T value_type;};

 这样就得到了相应的类型,同理,对于const T*有

template 
struct iterator_traits
{ typedef T value_type;};

 有了这个技巧,stl就可以根据需要制定提取迭代器相应类型的办法,比如对于下面五种有不同的方式提取类型

value_type

difference_type
pointerpointer
referencereference
iteratoriterator_category

具体方式书中有说,就不赘述了。

 

转载于:https://www.cnblogs.com/tonychen-tobeTopCoder/p/5154411.html

你可能感兴趣的文章
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
前端第七天
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
416. Partition Equal Subset Sum
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
[TC13761]Mutalisk
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
while()
查看>>