映射任意类型的向量
Mapping vectors of arbitrary type
我需要存储不同类型的列表向量,每个向量都由字符串标识符引用。现在,我使用的是std::map
,std::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++的工作方式。
- C++中函数的向量返回类型引发错误
- 具有 STL 向量类型成员的类的复制内存
- 创建一个类来访问和指定向量类型,并构建一个获取位置并为其分配区域的类
- 是否可以有一个模板函数,可以将向量和非向量类型都作为参数
- 具有基元类型的模板向量类型
- 在索引和值类型上参数化的惯用向量类型
- 使用迭代器成员函数是否仅适用于某些向量类型"empty()"?
- 通过glUniform 将 GLM 的向量类型传递给 OpenGL
- 尝试将用户定义的向量类型插入用户定义的类型向量
- 使用类作为向量类型时出错 - "Undeclared identifier"
- 在C++中,当两个向量类型不同时,如何将值存储到向量内部的向量中
- 如何访问和存储向量类型的结构成员
- 按参数中的向量类型重载函数
- boost::variant:具有递归向量类型的奇怪行为
- LLVM 传递计数向量类型指令
- 用异构boost::融合向量类型数据填充std::vector
- 如何定义自定义类的向量类型
- 真正的动态向量类型
- 如何在类的属性/变量中使用组合类作为向量类型
- 更快地删除向量类型