映射任意类型的向量

Mapping vectors of arbitrary type

本文关键字:向量 类型 任意 映射      更新时间:2023-10-16

我需要存储不同类型的列表向量,每个向量都由字符串标识符引用。现在,我使用的是std::mapstd::string作为键,boost::any作为其值(此处发布的示例实现(。

尝试在所有存储的向量上运行方法时,我已经摆脱了困境,例如:

std::map<std::string, boost::any>::iterator it;
for (it = map_.begin(); it != map_.end(); ++it) {
  it->second.reserve(100);  // FAIL: refers to boost::any not std::vector
}

我的问题:

  • 是否可以将boost::any转换为任意矢量类型,以便我可以执行其方法?
  • 有没有更好的方法来映射任意类型的向量并在以后使用正确的类型进行检索?

目前,我正在研究一种替代实现,它将boost::any替换为指向本答案中建议的基容器类的指针。这打开了一个全新的蠕虫罐,其中包含我需要解决的其他问题。如果有必要,我很乐意走这条路,但我仍然有兴趣知道我是否可以让它与boost::any一起工作,是否有其他更好的解决方案。

附言我是一个C++n00b新手(并且已经被Python的动态类型宠坏了太久了(,所以我很可能以错误的方式解决这个问题。严厉的批评(最好是建议(是非常受欢迎的。


大局:

正如评论中指出的那样,这很可能是一个XY问题,所以这里是我想要实现的目标的概述。

我正在为一个管理任务执行的模拟框架编写一个任务调度程序;每个任务都是对一组数据向量的基本操作。例如,如果在模型中将task_A定义为对"x"(double), "y"(double), "scale"(int)的操作,那么我们实际上尝试模拟的是对所有i值执行task_A(double x[i], double y[i], int scale[i])

每个任务(函数(都对不同的数据子集进行操作,因此这些函数共享一个共同的函数签名,并且只能通过特定的API访问数据,例如 get_int("scale")set_double("x", 0.2) .

在框架的先前版本(用 C 语言编写(中,任务是静态调度的,框架根据给定模型生成代码以运行模拟。任务的顺序基于从模型定义中提取的依赖关系图。

我们现在尝试使用运行时计划程序为所有模型创建一个通用运行时,该运行时计划程序在满足任务依赖项时执行任务。从生成特定于模型的代码到通用代码的转变带来了各种各样的痛苦。从本质上讲,我需要能够通用地处理异构向量并通过"名称"(也许是type_info(访问它们,因此上述问题。

我愿意接受建议。任何建议。

浏览添加的细节,我的第一反应是将数据分离到多个单独的地图中,并将类型作为模板参数。例如,您将get_int("scale")替换为get<int>("scale")set_double("x", 0.2)替换为set<double>("x", 0.2);

或者,使用 std::map ,您可以轻松地将其(例如(更改为 doubles["x"] = 0.2;int scale_factor = ints["scale"]; 之类的内容(尽管您可能需要对后者保持警惕 - 如果您尝试检索不存在的值,它将使用默认初始化而不是发出错误信号来创建它(。

无论哪种方式,您最终都会得到许多单独的集合,每个集合都是同构的,而不是试图将许多不同类型的集合放在一个大集合中。

如果你真的需要把它们放在一个整体集合中,我会认真考虑只使用一个结构,所以它会变成vals.doubles["x"] = 0.2;int scale_factor = vals.ints["scale"];

至少顺便说一下,我认为这不会丢失太多东西,并且通过始终保留静态类型,它似乎更适合C++的工作方式。