gpt4 book ai didi

c++ - 同时持有不同类型的集合

转载 作者:数据小太阳 更新时间:2023-10-29 07:41:17 26 4
gpt4 key购买 nike

传统上,我使用 C++ 和 Java 进行编程,现在我开始学习 Ruby。

那么我的问题是,像 ruby​​ 这样的语言如何在内部实现它们的数组和散列数据结构,以便它们可以同时保存任何类型?我知道在 Java 中,每个类都派生自对象这一事实可能是实现它的一种方法,但我想知道是否还有另一种方法。例如,在c++中,如果我想实现一个动态数组,可以同时保存多种类型的值(没有关系),我该怎么做?

澄清一下,我指的不是泛型编程或模板,因为它们只是为一个类型创建一个新的集合接口(interface)。我指的是这样的结构:

array = [1, "hello", someClass];

最佳答案

它们中的大多数通过创建 vector(或 listdeque 等)与您在 C++ 中获得的大致相同。 ) 的 boost::any,或类似的东西。

也就是说,它们基本上会在每种类型的对象存储在内存中时附加一些标签。当他们存储一个对象时,他们存储标签。当他们读取一个对象时,他们会查看标签以确定该对象的类型。当然,它们也在内部处理其中的大部分,因此您不必编写代码来确定您刚刚从集合中检索到的对象类型。

如果不清楚:“标签”只是分配给每种类型的唯一编号。如果您正在处理的系统具有原始类型,它通常会为每个类型预先分配一个类型编号。同样,您创建的每个类(class)都会分配一个唯一编号。

要在 C++ 中做到这一点,您通常会创建一个中央标记注册表。当您注册一个类型时,您会收到一个唯一的编号,用于标记该类型的对象。当一种语言直接支持这一点时,它会自动执行注册类型并为每种类型选择唯一标记的过程。

虽然这可能是实现此类事情的最常见方法,但绝对不是唯一的方法。例如,也可以为特定类型指定特定的存储范围。当您分配给定类型的对象时,它总是从该类型的地址范围分配。当您创建“对象”集合时,您实际上并不是在存储对象本身,而是在存储包含对象地址的内容。由于对象是按地址分隔的,因此您可以根据指针的值确定对象的类型。

关于c++ - 同时持有不同类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27592025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com