侯捷C++ stl体系结构与源码剖析:tuple底层实现详解(递归继承)

tuple,一堆东西的组,元组。它可以指定任意的元素,任意的类型,形成一个结构体。
注意下面tuple的声明和定义,用法。make_tuple可以直接把值放进去,类型编译器会实参推导。
tuple还可以比较大小,如果是同一类型就逐一比较。tie(i1,f1,s1)=t3是将t3的元素都拿出来,然后附着到那三个变量上,连续赋值。还能够使用tuple_element<1,TupleType>::type拿出1号元素的类型出来。
侯捷C++ stl体系结构与源码剖析:tuple底层实现详解(递归继承)
底层实现:用到了可变参数模板。
可变参数模板都是一个主题加一个终止,来进行递归。
一开始int是head,float和string是tail。
注意这里有一个非常妙的地方!就是private继承,tuple<Head,Tail…>继承了tuple<Tail…>,其实就是递归继承了它其中的某一部分(除去头部的一部分)。那就形成了右边的这种结构,tuple<int,float,string>继承了tuple<float,string>等等等。上面class tuple<> {},这边是全特化,这是终止递归。这边递归继承,子类的大小要加上父类的大小,然后就集成了所有的类型元素。tuple<>为空时,如果单独存在,内存为1,被继承的话内存大小就是理论值0。
这里又有一个非常妙的地方:head()它是返回一个值。而tail()它是返回一个对象,一开始是return *this,返回this指针指向的对象(tuple对象),但是返回类型是inherited,这是tuple<Tail…>的类型,是tuple继承的类型,是它所继承父类的类型,这时候会向上转型,指向一个新的类型。
侯捷C++ stl体系结构与源码剖析:tuple底层实现详解(递归继承)