问题标签 [heterogeneous-array]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Haskell 中存在类型的编译问题
我写了一个简单的类型类Shape:
我也有具体的类型Circle,Rect并且Triangle像这样实例化这个类型类:
为了使用包含具体类型实例的异构列表,Circle我遵循了关于异构集合的 haskell wiki 教程并实现了一个存在数据类型,如下所示:RectTriangleShapeType
我让ShapeType实例化Shape类型类:
现在我可以在如下代码中使用它:
不幸的是,这只有在我省略该行时才能编译
move (x,y) (MkShape s) = move (x,y) s
否则我会收到以下编译错误:
这对我来说没有意义,因为s在其他三种情况下,“提取”模式匹配以供在委托调用中使用可以正常工作。
任何想法这里出了什么问题?
更新
通过这个简单的修复,代码现在可以按预期工作:
c++ - 从 C++ 中的自定义异构容器打印
我正在阅读有关在 C++ 中构建自定义异构容器的博客。在博客中,作者使用访问者模式打印出容器中按类型排序的每个元素。我想知道我是否可以写一个访问者,以便我可以按照插入的顺序打印出元素?
c++ - 将异构数据作为字符序列连续存储在内存中
我有大量的字符串和一些与每个字符串相关的数据。为简单起见,我们假设数据是int每个字符串的一个。假设我有一个std::vector<std::tuple<std::string, int>>. 我想尝试使用单个堆分配将这些数据连续存储在内存中。我以后不必担心添加或删除字符串。
一个简单的例子
构造 anstd::string需要堆分配,而访问chars的条目std::string需要取消引用。如果我有一堆字符串,我可以通过将所有字符串存储在一个中std::string并将每个字符串的起始索引和大小存储为单独的变量来更好地利用内存。如果我愿意,我可以尝试将起始索引和大小存储在std::string自身中。
回到我的问题
我的一个想法是将所有内容存储在std::stringorstd::vector<char>中。的每个条目都std::vector<std::tuple<std::string, int>>将像这样在内存中排列:
- 下一个字符串的长度(
int或size_t) chars表示字符串 ( )的字符序列- 一些数字零字符用于正确
int对齐(chars) - 数据 (
int)
这需要能够将chars 序列解释为int. 以前有过关于此的问题,但在我看来,尝试这样做可能会导致未定义的行为。我相信我可以通过检查sizeof(int).
我的另一个选择是创建一个工会
在这里,我需要注意char每次使用的 s数量int是在编译时根据sizeof(int). 然后我会存储一个std::vector<CharInt>. 这似乎比使用更“C++” reinterpret_cast。这样做的一个缺点是访问 a 的第二个char成员CharInt需要额外的指针添加(指向CharInt+ 1 的指针)。相对于使所有内容都连续的好处,这个成本似乎仍然很小。
这是更好的选择吗?还有其他选择吗?我需要考虑使用该union方法的陷阱吗?
编辑:
我想说明如何CharInt使用。我在下面提供了一个示例:
请注意,我不会像访问第一个或第三个CharInts 一样访问它们char。我不访问第二个CharInt,就好像它是一个int. 这是main:
产生所需的输出