首页 > 解决方案 > 如何使用空字段改进 std::tuple?

问题描述

我认为在 std::tuple 中有 void 字段是有意义的,只要您不访问此字段 - 但您应该能够实例化元组。这是一个例子:

template <typename... T>
struct Table {
  std::vector<std::tuple<T...>> data;
  std::tuple<std::unordered_map<T, std::vector<size_t>>...> indices;
};

在这里,我们在每个数据列的索引中都有一个字段。假设您没有为每一列创建索引。理想情况下,我不想支付我从未使用过的空 std::unordered_map 的成本。

我在这里有什么选择?

编辑:换句话说,我如何创建像稀疏元组这样的东西?

标签: c++c++11templatesvariadic-templates

解决方案


从技术上讲,因为元组的类型必须是可引用的。从语义上讲,因为 void 并不是真正的完整状态类型。

void更像是无类型。您不能引用它,sizeof这不是真正合法的,并且必须用作元组的类型。这会引发各种奇怪的问题。那么 sizeof(void) 应该是什么?是否tuple<int,void>相同tuple<int>

因此,惯用的解决方案是使用为作业指定的实际类型,该类型std::ignore实际上是为此而设计的:

一个未指定类型的对象,这样任何值都可以分配给它而不会产生任何影响。用于std::tie在解包时使用std::tuple, 作为未使用的参数的占位符。

它也在 中定义tuple,所以不要创建自己的结构,相信标准库。


推荐阅读