我需要存储不同类型的列表向量,每个列表向量都由字符串标识符引用。目前,我使用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
)访问它们,因此上述问题。
我愿意接受建议。任何建议。
答案 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 ++的工作方式。