std::tuple 是如何实现的?

新手上路,请多包涵

我想知道如何在 C++0x 的标准库中实现元组。我尝试阅读 libstdc++ 手册中的描述,然后阅读 模板列表,但很难理解它是如何工作的,尤其是在阅读代码时。

有人可以用几句话向我解释元组实现的想法吗?我想知道这一点,因为我考虑在我的代码中使用元组,我想了解它是如何工作的以及它带来了什么类型的开销(仅延长编译时间,在内存上执行许多复制操作,在构造函数中执行许多其他函数, ETC。)。

原文由 Goofy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 547
2 个回答

实现元组的一种方法是使用多重继承。元组元素由叶类持有,元组类本身继承自多个叶。在伪代码中:

 template<typename T0, typename T1, ..., typename Tn>
class PseudoTuple : TupleLeaf<0, T0>, TupleLeaf<1, T1>, ..., TupleLeaf<n, Tn> {
   ...
};

每个叶子都有一个索引,因此即使它们包含的类型相同,每个基类也变得唯一,因此我们可以使用简单的 static_cast 访问第 n 个 元素:

 static_cast<TupleLeaf<0, T0>*>(this);
// ...
static_cast<TupleLeaf<n, Tn>*>(this);

我在这里写了关于这个“平面”元组实现的详细解释: C++11 元组实现细节(第 1 部分)

原文由 mitchnull 发布,翻译遵循 CC BY-SA 3.0 许可协议

元组通常实现为编译时链表。

代码通过模板语法有点混淆,但通常存在以下元素:

  1. 带有头尾元素的类链(cons-elements)
  2. 一个空的尾部实例来指示列表的结尾。
  3. 递归代码将列表遍历到某个索引,实现为递归模板实例化(在编译时实例化)。

C++03 中存在合理的实现(例如 boost)。

正如 Motti 所提到的,可变参数模板允许无限数量的元素。

成本通常是编译时间。复制构造函数可能会在初始化期间(最多 1 个)以及复制元组本身时被调用。

原文由 mirk 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题