SGI-STL简记(三)-构造、类型萃取特性、未初始化解析

stl_construct.h :
    提供多种构造器、销毁器模板函数;
    构造器construct提供了给定值构造和默认构造方式,通过调用重载函数_Construct实现;
    销毁器destroy提供了销毁指针和迭代器的方式,通过调用重载函数_Destroy实现;
    _Construct:通过“放置”new,构造实现;
    _Destroy:通过调用模板类型对象析构函数实现,对于迭代器器方式,则通过__destroy(内部通过__destroy_aux)遍历销毁,因内置数据类型不需要销毁,
    故内部需要判断是否为内置类型,对非内置类型则调用对应类型的析构函数即可,否则不处理;
    __destroy_aux:重载的模板类,通过__false_type或__true_type确定是否为可隐式销毁的对象;
    此外_Destroy因普通内置类型的指针也可作为迭代器,故又重载了各个基本类型的处理(不处理);

type_traits.h :
    类型萃取、特性;
    两个特殊类型__true_type、__false_type,一般作为某些模板参数的识别的标识,如上面的__destroy_aux;
    __type_traits:类型特性萃取模板类,其中has_trivial_default_constructor、has_trivial_copy_constructor、has_trivial_assignment_operator、
    has_trivial_destructor、is_POD_type分别表示为隐式默认构造、拷贝构造、赋值操作、隐式析构、是否为原内置类型,默认情况下均为__false_type;
    其他的__type_traits特化版本均为内置类型(如:int,bool,float,...,char *等)均为__true_type,
    _Is_integer:模板函数,是否为整型(或可转化为整型的类型(如:int, unsigned char, short, long long ...)),其中_Integral在其他情况默认为__false_type;
    当为整型类型时,为__true_type;

    此外还有各个组件中基本上都会用到的类型重声明:
        typedef size_t     size_type;
        typedef ptrdiff_t  difference_type;
        typedef _Tp*       pointer;
        typedef const _Tp* const_pointer;
        typedef _Tp&       reference;
        typedef const _Tp& const_reference;
        typedef _Tp        value_type;

stl_uninitialized.h :
    初始化填充、拷贝:
    uninitialized_copy:目前提供3个重载版本,其中两个分别对char*、wchar_t*数据类型直接调用memmove内存拷贝,另一个提供迭代器范围拷贝,其通过
    __uninitialized_copy处理,内部获取结果前向迭代器的内容指针类型并再次调用__uninitialized_copy_aux;__uninitialized_copy_aux内部通过萃取
    内容指针类型是否为is_POD_type,实现分别处理不同的内容,若为原始POD则内部直接调用copy即可,否则遍历迭代器并分别调用_Construct构造,若失败
    抛出了异常则调用_Destroy析构之前已成功构造的对象,此外根据迭代器不同,有不同的迭代策略;
    uninitialized_copy_n:同uninitialized_copy,提供了拷贝个数的参数;
    uninitialized_fill、uninitialized_fill_n:类型于uninitialized_copy与uninitialized_copy_n;原始POD类型通过fill填充,否则遍历迭代调用_Construct构造,
    若失败抛出了异常则调用_Destroy析构之前已成功构造的对象,此外根据迭代器不同,有不同的迭代策略;
    

原文地址:https://www.cnblogs.com/haomiao/p/11647208.html

时间: 2024-08-28 23:11:49

SGI-STL简记(三)-构造、类型萃取特性、未初始化解析的相关文章

STL的迭代器和类型萃取

今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于是就有了STL的两大部分,容器(container)和泛型算法(algorithms),泛型算法有很多参数都是迭代器. 举一个栗子!泛型算法find()的实现! 1 template<class InputIterator, class T> 2 InputIterator find(InputI

C++_模板类与类型萃取技术

在声明变量,函数,和大多数其他类型实体的时候,C++要求我们使用指定的类型.然而,有许多代码,除了类型不同之外,其余部分看起来都是相同的,比如,下面这个例子: bool IsEqual (int left, int right) {     return left == right; } bool IsEqual (const string& left , const string& right) {     return left == right; } void test() {   

【干货】C++通过模板特化实现类型萃取实例--实现区分基本类型与自定义类型的memcpy

类型萃取是一种常用的编程技巧,其目的是实现不同类型数据面对同一函数实现不同的操作,如STL中cout的实现,它与类封装的区别是,我们并不用知道我们所调用的对象是什么类型,类型萃取是编译器后知道类型,先实现,而类的封装则是先定义类型,后实现方法.在这里我们可以用模板的特化实现其编程思想. 我们以memcpy为例,当我们拷贝的是基本类型时,只用拷贝所传递指针上的数据,如果是string类型呢,我们则需要在堆上开辟空间,所传递的指针如果被直接复制,则有可能(vs下的string类型的实现原理是若字符串

C++ 模板 之 类型萃取 与 容器适配器

类型萃取 在模板这里主要就是对于模板的不同类型的实例化 有不同的方案 这样可以提高效率等 比如 下面的 顺序表 在扩容时的拷贝 对于没有含有指向空间的指针的类 如int 自动使用memcpy() 对于含有指向空间的指针的类 如string 就自动一个一个的赋值 防止浅拷贝导致两个指针指向同一空间 析构两次时出错 类型萃取实现 主要用到了 模板  模板特化 内嵌型别  也可用函数重载 详见Copy() //(1)-------类型萃取 实现顺序表 //----------------------C

第17课 类型萃取(1)_基本的type_traits

1. type_traits类型萃取 (1)type_traits通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性,这些特性根据类型的不同而异.在程序设计中可以使用这些traits来判断一个类型的一些特性,引发C++的函数重载机制,实现同一种操作因类型不同而异的效果. (2)type_traits提供了丰富的编译期计算.查询.判断.转换和选择的帮助类. (3)type_traits的类型选择功能,在一定程序上可以消除冗长的switch-cast或if-else的语句.提

STL(七)之萃取技术

traits技术 原理:利用template的参数推导机制获取传入的参数型别. template<typename T> struct Iter { typedef T value_type; .... } template<typename T> typename T::value_type func(T* ite) {return *ite;} 这种程度,依旧会遇到一个问题:如果不是一个class type(比如指针,引用),就无法进行正确的参数推导.可以使用模板偏特化来处理这

类型萃取

类型萃取是实现不同类型数据面对同一函数实现不同的操作,它与类封装的区别是:并不用知道所调用的对象是什么类型,类型萃取是编译后知道类型,先实现:而类的封装则是先定义类型,后实现方法. 类型分为基本类型(POD),和自定义类型. 在这里用模板的特化实现其编程思想: 以memcpy为例,当拷贝的是基本类型(POD)时,只用拷贝所传递指针上的数据,如果是string类型,则需要在堆上开辟空间,所传递的指针如果被直接复制,则有可能(vs下的string类型的实现原理是若字符串不长则以数组保存,若字符串过长

c++ 类型萃取(模板类型 运用)

//类型萃取 #pragma once #include<iostream> using namespace std; struct __TrueType//定义类 普通类型(基本类型的) { bool Get() { return true; } }; struct __FalseType//定义类 非基本类型 { bool Get() { return false; } }; template <class _Tp>//模板类 (类型萃取) struct TypeTraits 

头一回发博客,来分享个有关C++类型萃取的编写技巧

废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 1 #include<iostream> 2 #include "../../traits/traits.hpp" 3 4 5 using namespace std; 6 7 8 int show(char i, int j) 9 { 10 return 1; 11 } 12 13 struct Stu