4

我需要存储一个不同类型的列表向量,每个向量都由一个字符串标识符引用。现在,我使用std::mapwithstd::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为指向基础容器类的指针,如this answer中所建议的那样。这开辟了一个全新的蠕虫罐头,还有我需要解决的其他问题。如有必要,我很高兴沿着这条路线走下去,但我仍然想知道我是否可以使它与 一起工作boost::any,是否有其他更好的解决方案。

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


大图:

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

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

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

在框架的前一个化身(用 C 语言编写)中,任务是静态调度的,框架基于给定模型生成代码以运行模拟。任务的排序基于从模型定义中提取的依赖图。

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

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

4

1 回答 1

0

查看添加的细节,我的直接反应是将数据分成多个单独的地图,类型作为模板参数。例如,您将替换get_int("scale")get<int>("scale")set_double("x", 0.2)set<double>("x", 0.2);

或者,使用std::map, 您可以很容易地将它(例如)更改为类似doubles["x"] = 0.2;or int scale_factor = ints["scale"];(尽管您可能需要对后者有点警惕——如果您尝试检索一个不存在的值,它将使用默认值创建它初始化而不是发出错误信号)。

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

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

至少临时来说,我认为这并没有损失太多东西,并且通过始终保留静态类型,它似乎更适合 C++ 的预期工作方式。

于 2012-05-03T17:56:02.527 回答