目前在学习STL,看到一个开源的项目MyTinySTL,非常不错。想着照着这个代码自己敲一遍应该也能有些进步。然后就开始了学习过程。
首先分析的是vector
以下是由vector.h关联的所有头文件
本篇分析一下util.h , xxx
这里先来研究几个函数
std::enable_if
std::is_constructible
std::is_default_constructible
std::is_copy_constructible<U1》
std::is_convertible
首先看std::enable_if的定义:
// Primary template. (基本定义)
/// Define a member typedef @c type only if a boolean constant is true.
template<bool, typename _Tp = void>
struct enable_if
{ };
// Partial specialization for true. (偏特化版本)
template<typename _Tp>
struct enable_if<true, _Tp>
{ typedef _Tp type; };
根据以上定义可以看出,如果std::enable_if的第一个参数为true,则把第二个模板参数定义为type,否则什么都没有。
后面的三个定义
std::is_constructible , std::is_default_constructible, std::is_copy_constructible有如下的继承关系
这几个类用于判断是否能够构造对象,它们有一个成员变量value,是true或false
std::is_convertible 是判断能否转换
了解了以上函数的作用后,来看util.h会简单一些。
该文件中先定义了右值转发(move)、完美转发(forward)
然后定义了swap相关
然后定义了pair结构体,该结构体有两个成员变量,有几个构造函数,
构造函数包括默认构造函数,隐式转化构造函数,等等 ; 重载了赋值操作符,swap函数,== 操作符。
然后还在最外面重载了两个pair的比较操作符(==, <, !=, > 等等),以及针对pair的swap函数,和如何构造一个pair的make_pair函数。
=============================================
exceptdef.h 文件定义了几个有关异常的宏
#define MYSTL_DEBUG(expr) \
assert(expr)
#define THROW_LENGTH_ERROR_IF(expr, what) \
if ((expr)) throw std::length_error(what)
#define THROW_OUT_OF_RANGE_IF(expr, what) \
if ((expr)) throw std::out_of_range(what)
#define THROW_RUNTIME_ERROR_IF(expr, what) \
if ((expr)) throw std::runtime_error(what)