STL 中traits 技术的应用

本文介绍了STL中traits技术的重要性和应用,特别是在获取迭代器类型方面的使用。通过iterator_traits,可以获取迭代器的五种内部类型:value_type、difference_type、reference_type、pointer_type和iterator_category。同时,文章讨论了如何利用traits来实现函数重载和优化,并提到了_SGI STL私房菜中的_type_traits,这是一个能判断类型特性的强大工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

traits

前言

都说traits 是STL源码的钥匙,今天看来完了这一章节,确实强大,我先讲其实现的内部原理。在我看懂了traits之后,我就想,既然traits如此的强大,那我就以使用这的角度来领略它的美好,顺便加强它的理解,还是先浅谈traits的一些原理

为了取得iterator 的类型,在STL可花费了大量的精力:

迭代器的类型:

第一种获取迭代器的类型之法:利用模板函数参数推导机制:

看书中的例子:

//main函数中如此定义
int main()
{
    int i;
    func(&i); //这里传的是地址
}

//调用了func函数,我们来看看这个函数是怎样定义的

void func(I iter)
{
   func_impl(iter,*iter); 
//哦,又调用了另外一个函数,有两个参数,第一个是原来的参数 I类型,第二个是 *I 的类型,也就是*(&i) = i,恢复 了原来的对象类型
}//好的再看看func_impl到底有何玄机														
template<class I, class T>
void fucn_impl(I iter, T t)
{
T tmp ;// 呵呵,T的类型那就是i的类型,那么在不知道i类型的情况下通过两巧妙的调用很好的利用了函数模板的参数推到机制
}


 

 

好的,很完美的推出了我们未知对象的类型,但是,如果我要的对象类型表示函数的返回值,那么这个方法就不可行了,因为我们是在间接调用了两个函数,而且最后在一个函数体的里边取得的类型

显然用于修饰函数的返回值不合适  ,这个办法不通用了,怎么办呢,书中的第二办法是声明内嵌类型

声明内嵌类型:

比如说:


</pre><pre name="code" class="cpp">template <class T>
struct MyIter
{
    typedef T value_type;
	//这句代码就可以通过value_type 来去的 T 这个类型了(如果对于这句代码的作用不太理解的话,
	//可以看看我之前的那篇关于typedef的实验博客 <a target=_blank href="http://blog.youkuaiyun.com/dalleny/article/details/39016201">http://blog.youkuaiyun.com/dalleny/article/details/39016201</a>,
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值