我认为在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的费用。
我有什么替代方案?
编辑:换句话说,我如何创建类似稀疏元组的东西?
答案 0 :(得分:2)
从技术上讲,因为元组的类型必须是可引用的。从语义上讲,因为void实际上并不是一个完整的状态类型。
void
更像是无类型。你不能引用它,sizeof
不是真正合法的,并且要用作元组的类型,它必须是。这会引发各种奇怪的问题。那么sizeof(void)应该是什么? tuple<int,void>
和tuple<int>
是否相同?
因此,惯用的解决方案是使用为作业std::ignore
指定的实际类型,它实际上是为此做的:
未指定类型的对象,以便可以为其分配任何值而不起作用。打开
std::tie
时打算与std::tuple
一起使用,作为未使用参数的占位符。
它也在tuple
中定义,所以不要制作自己的结构,信任标准库。