《STL源码剖析》学习--traits

在本书迭代器一节提到了Traits编程技法,将其誉为stl源码门匙,在《C++编程思想》一书中,将其列为模板编程中的习语“特征”,这里进行总结。

traits技术 也往往和迭代器一起使用。

1、理解概念

在《C++编程思想》一书中,特征模板技术,定义为一种将与某种类型相关联的所有声明绑定在一起的方法,可以以一种灵活的方法从语境中将类型和值进行“混合和匹配”,同时又使得代码灵活易读且易于维护。

在本书中,如果I定义有自己的value type,那么通过traits的作用,萃取出来的value_type就是I::value_type。意思即是通过在类内部定义value_type的值,就可以通过获取value_type来获取模板的类型。

如:

template <class I>
struct iterator_traits{
	typedef typename I::value_type value_type;
}

2、作用

多了一层间接性,带来什么好处呢?

那来看一下,如果不用traits怎么来获取value type,方法一可以使用template参数推导,但是推导机制推导的只是参数,不能是函数的返回值;方法二,采用内嵌类型,typedef I value_type,此时,如果T为一个原生指针或者其他非class type,就无法定义内嵌类型。所以,好处就很明显了。是traits可以拥有特化版本,这样就可以获取原生指针或者其他非class type的类型了。

如:

template <class I>
struct iterator_traits <I*> { //偏特化版--原生指针
	typedef I value_type;
}

另外,针对指向常数对象的指针,如果我们采用上面一个模板函数,得打的类型为const 之类,此时不能更改变量,也就失去了意思。所以针对指向const的指针型别也做一个特化。

template <class I>
struct iterator_traits <const I*> { //偏特化版--原生指针
	typedef  I value_type;
}

3、stl中的使用

在迭代器一节中很明显看出traits的作用。

迭代器所指对象的型别,成为该迭代器 的value type。最常用的的迭代器型别有五种:value type(所指对象型别)\ difference type(两个迭代器之间的距离)\ pointer(*)\ reference (&)\ iterator catagory(Input\Output\Forward\Bidirectional\Random五种)。

在迭代器里面必须要定义这五种相应型别才可以和stl很好的配合使用。

知道了迭代器的型别,为了提供某些算法的效率,针对不同的型别,可以利用型别对算法进行重载,以提高效率。

4、扩展使用

sgi把traits技法进一步扩大到迭代器以外,这里讲解了__type_traits,本书第二章析构时判断是不是trivial dtor时,就是采用了此种方法。

了解一个概念,POD (plain old data),指标量型别或者传统的C struct型别。POD型别拥有无关痛痒的(trivial)构造/析构/复制构造/赋值函数,对于POD型别采用最有效的初值填写或者释放手法,而对于non-POD采用最保险安全的构造或者析构做法,来提高效率。

这里__type_traits有许多typedefs,包括 :has_trivial_default_constructor\has_trivial_copy_constructor\has_trivial_assignment_constructor\has_trivial_default_destructor\is_POD_type等,其值不是__true_type就是__false_type,默认是__false_type。

这样就可以根据类型来尽量提高分配或者回收内存时的效率。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值