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)