2.4.1 通过嵌套实现元组
假设有一个类模板tuple,有两个成员变量可以保存任意类型的数据。将其中一个变量的类型设计为另一个tuple实例,则最多可以保存三个数据。依次类推,通过嵌套tuple,可以构造出能保存任意数目任意类型数据的元组类。下面的代码演示了如何通过嵌套用单一类模板保存多个任意类型数据:
- #include <iostream>
- #include <string>
-
- // 用于构建元组的类模板
- template<typename T, typename N>
- struct tuple
- {
- T value;
- N next;
- tuple(T const &v, N const &n) : value(v), next(n) {}
- };
-
- // 方便向元组中增加元素的函数模板
- template<typename T, typename N>
- tuple<T, N> push(T const &v, N const &n)
- {
- return tuple<T, N>(v, n);
- }
-
- int main()
- {
- // 通过typedef构造4个元素的元组类型
- typedef tuple<int, char> tuple2;
- typedef tuple<float, tuple2> tuple3;
- typedef tuple<std::string, tuple3> tuple4;
-
- // 通过嵌套调用push函数模板构造一个4元素的元组类
- tuple4 tup4 = push(std::string("awesome!"),
- push(.1f,
- push(1, 'a')));
-
- // 可以通过元组类的next成员访问到元组中任一元素
- std::cout << tup4.value << ','
- << tup4.next.value << ','
- << tup4.next.next.value << ','
- << tup4.next.next.next
- << std::endl;
- }
这个例子是否看起来很眼熟。是的,类模板tuple与前面介绍的hetero_node很类似,不同之处在于hetero_node中的指针成员变量换成了tuple中的普通成员变量。虽然改变仅此而已,却完全消除了hetero_node构成的异质链表存储元组时的额外存储开销。现在可以说,这就是简单而没有额外储存开销的元组实现方法之一。但这种方法也有其不足,就是在构造元组时存在元素的重复复制问题。例如上例中元组的第四个元素字符'a',在嵌套调用push函数模板构造元组时,每调用一次push就被复制一次。当所存元素数据类型比较复杂时,无疑这种重复复制对程序性能的影响不可忽视。