STL源码(2):迭代器、trait

const_iterator:不可通过迭代器改变所指的对象

一、iterator_traits:
在这里插入图片描述
算法在使用iterator的时候需要知道迭代器指向对象的属性,如果这里的迭代器是一个对象,则可以通过 ::直接获取,但是如果迭代器是一个指针,不能直接获取。因此需要traits来获取迭代器指向对象的属性
在这里插入图片描述
二、_type_trait:
如果对象是一个内置类型(int,double),或者对象的成员变量是内置类型,编译器会自动调用析构函数,我们显示调用析构函数会造成效率下降,因此对于无意义的析构函数的对象不需要调用析构函数。因此使用_type_trait来获取对象的构造、析构等函数是否有意义,构造两个对象来表示是否有意义。

struct _true_type{};//无意义的函数
struct _false_type{};//有意义的函数

对于一个对象来说:
1)如果是内置类型或者c struct(只有成员没有函数),ctor、dtor、assigmnet、copy都是trivial(无意义)
2)有任何一种函数的显示声明,是一个继承类,有非静态成员指针并且使用了动态分配,即是non-trivial

template<typename T>
struct type_traits
{
	typedef _false_type has_trivial_default_constructor;//默认构造函数是否有意义?
	typedef _false_type has_trivial_copy_constructor;//拷贝构造函数是否有意义?
	typedef _false_type has_trivial_assgignment_constructor;//拷贝赋值操作是否有意义?
	typedef _false_type has_trivial_destructor;//析构函数是否有意义?
	/*POD意指Plain Old Data,也就是标量型别或传统的C struct(传统的C struct只能
	包含数据成员,不能包含函数成员。POD型别必然包含无意义的ctor/dtor/copy/assignment函数
	*/
	typedef _false_type is_POD_type;//是否为Plain Old Data?
};

因为内置类型和原生指针均为_true_type,因此出现了对内置类型和原生指针的偏特化版本

struct type_traits <char>
{
	typedef _true_type has_trivial_default_constructor;
	typedef _true_type has_trivial_copy_constructor;
	typedef _true_type has_trivial_assgignment_constructor;
	typedef _true_type has_trivial_destructor;
	typedef _true_type is_POD_type;
};

可能先根据用iterator_trait获取迭代器指向对象的类型,再根据type_trait获取对象的ctor、dtor是否有意义,没有意义的话直接在内存操作,否则调用相关的函数。

可以直接获取变量的type_trait:
在这里插入图片描述
1)去除cv关键字:
在这里插入图片描述
就是为const,volite设计偏特化的版本,其他的为泛化的版本
2)进行查询:
为所有的可能实现一个偏特化继承自true_type{},其余的为泛化(false_type)
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值