我需要存储一个不同类型的列表向量,每个向量都由一个字符串标识符引用。现在,我使用std::map
withstd::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
)访问它们,因此上述问题。
我愿意接受建议。任何建议。