任意类型的映射向量

时间:2012-05-03 15:06:25

标签: c++ stdvector stdmap boost-any

我需要存储不同类型的列表向量,每个列表向量都由字符串标识符引用。目前,我使用std::map作为键std::string作为键,boost::any作为值(示例实现posted here)。

当我试图在所有存储的矢量上运行方法时,我已经失败了,例如:

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转换为任意向量类型,以便我可以执行其方法?
  • 是否有更好的方法来映射任意类型的矢量,然后使用正确的类型检索?

目前,我正在尝试使用替代实现,该实现用this answer中建议的指向基本容器类的指针替换boost::any。这开辟了一整套新的蠕虫病毒以及我需要解决的其他问题。如果有必要,我很乐意沿着这条路走下去,但我仍然有兴趣知道我是否可以使用boost::any,如果还有其他更好的解决方案。

P.S。我是一个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)访问它们,因此上述问题。

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

1 个答案:

答案 0 :(得分:0)

通过添加的细节,我的直接反应是将数据分成多个单独的地图,类型作为模板参数。例如,您将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 ++的工作方式。