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

标签 c++ ruby

传统上,我使用 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/

相关文章:

ruby-on-rails - 监听错误 : unable to monitor directories for changes

ruby - 如何更改默认的 gem 版本

ruby - "rvm use"上的 RVM 1.25.22(稳定)错误

ruby - 访问 Ruby 项目的 YAML 文件中的环境变量(使用 ${ENVVAR} 语法)

ruby-on-rails - 以正确的方式从 ruby​​ on rails 执行查询

c++ - 为什么不包含 iostream 头文件?

c++ - 循环抛出 "parser stack overflow, program too complex"的编译时间

c++ - 在另一个函数中调用函数

c++ - 如何在 C++ 中的数组中加载 Wav 文件?

c++ - 为什么在 C++11/C++14 中有针对自动和大括号初始化器的特殊类型推导规则?