一、tuple用例
元组其主要操作如上所示,其里面可以放置不定量且不同类型的元素数据,底层源码实现如下(利用variadic templates):
二、tuple源码
首先,其在这里运用的自我继承,且参数层层拆分递减【与前面的hash function通用模板的拆分递减参数调用类似,只不过这里是运用在类继承上面。而且这是C++设计模式中的一种。】,每往上继承一层对应的父类传入模板参数就被拆分少1个,一直往上继承,直到继承到base父类【此时传入模板参数为空】。
tuple<int, float, string> t(41, 6.3, “nico”);
首先将传入模板参数设置Head=int, Tail…=float, string,然后调用其构造函数,将m_head=41,inherited=float 6.3, string “nico”【注意,这里并不是tuple<float, string>(6.3, “nico”)创建临时对象,而是对所继承的父类进行参数指定即相当于 tuple<Head, Tail…>=float, string,则此一层所继承的父类为 tuple<float, string> 且 float m_haed=6.3】。以此类推,逐层往上进行上层的父类参数指定与赋值,如右边所示。
t.tail()的操作:
进入内部操作,返回的首先是t本身【本来指向的是框起来存放(41,6.3,“nico”)这一整块的地址】,然后再经过inherited& 转型,最终 返回的是指向框起来存放(6.3,“nico”)这一整块的地址【相当于转到指向上一层所继承的父类了】。
因而 &(t.tail()) 取到的地址是指向框起来存放(6.3,“nico”)这一整块的地址,则 t.tail().head() 取得的便是6.3。