c++ - 如何使用空字段改进 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 的成本。
我在这里有什么选择?
编辑:换句话说,我如何创建像稀疏元组这样的东西?
解决方案
从技术上讲,因为元组的类型必须是可引用的。从语义上讲,因为 void 并不是真正的完整状态类型。
void
更像是无类型。您不能引用它,sizeof
这不是真正合法的,并且必须用作元组的类型。这会引发各种奇怪的问题。那么 sizeof(void) 应该是什么?是否tuple<int,void>
相同tuple<int>
?
因此,惯用的解决方案是使用为作业指定的实际类型,该类型std::ignore
实际上是为此而设计的:
一个未指定类型的对象,这样任何值都可以分配给它而不会产生任何影响。用于
std::tie
在解包时使用std::tuple
, 作为未使用的参数的占位符。
它也在 中定义tuple
,所以不要创建自己的结构,相信标准库。
推荐阅读
- php - 从 Laravel 的响应中获取数组
- vue.js - 如何在 nuxt 插件上使用 publicRuntimeConfig
- java - 为什么没有输出显示?在这里,我试图在交替位置显示两个字符串
- javascript - 使用 Ajax 将数据从视图传递到控制器会导致控制器方法出现 404 错误
- sparql - 基于 CONSTRUCT 子查询中定义的新属性的 SPARQL 属性路径
- wpf - “CaptureElement”类型的值无法转换为 Control 或 UIElement
- reactjs - 我在 React useEffect 中得到无限循环,我完全糊涂了
- java - Java 8 函数式编程避免条件
- javascript - 直方图类型 highcharts 访问系列
- ansible - 更改当前目录并留在那里