2.4.2 用类实现元组
实际上,最直接的元组构造法就是摒弃嵌套,直接用一个类来实现。还是以三元组为例,则下面的类模板就可构造任意元素类型的三元组:
- template<typename T0, typename T1, typename T2>
- struct tuple3
- {
- T0 v0;
- T1 v1;
- T2 v2;
- tuple3(T0 const &_v0, T1 const &_v1, T2 const &_v2) :
- v0(_v0), v1(_v1), v2(_v2) {}
- };
以此法构造元组不会有额外存储开销,构造时也不存在重复复制问题。但其缺点也很明显,就是只能构造三元组。假如需要一个可存4个元素的元组时,需要另外准备一个类模板tuple4。为应付各种可能的元素数目,就可能需要准备从tuple1到tuple20的一系列类模板。当类模板很简单时可以一一写成,但如果要为这一组模板稍稍增加一些功能,例如重载一些运算符,则代码量会大大增加。不过,利用C++(www.cppentry.com)语言中的宏定义,可以很方便地自动生成从tuple1到tuple20的所有类模板。C++(www.cppentry.com)库boost采用该方式来实现元组类boost::tuple。
现在,随着C++(www.cppentry.com)11新标准中引入变长模板参数,更可以轻松实现能保存任意数目任意类型的元组类模板,在随后有关新标准的章节中会详细介绍其实现方法。
回到本篇的主旨类模板上,从链表节点的例子可以看到,数据结构可以摆脱具体数据类型的束缚而抽象成类模板。再进一步,类模板扩展了软件开发者的设计思路,以简单几行模板代码就可实现原本几乎不可能实现的数据结构,如异质模板。类模板的灵活之处还在于扩展了C++(www.cppentry.com)语言本身,原本并不属于C++(www.cppentry.com)内置的数据结构(如元组),经由类模板实现后也可轻松使用。