如何用空字段改进std :: tuple?

时间:2018-04-27 02:11:56

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

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

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的费用。

我有什么替代方案?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  

未指定类型的对象,以便可以为其分配任何值而不起作用。打开std::tie时打算与std::tuple一起使用,作为未使用参数的占位符。

它也在tuple中定义,所以不要制作自己的结构,信任标准库。