gpt4 book ai didi

c++ - 任意类型的映射 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:07 26 4
gpt4 key购买 nike

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

尝试在所有存储的 vector 上运行一个方法时,我遇到了困难,例如:

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

目前,我正在尝试另一种实现方式,它将boost::any 替换为指向容器基类的指针,如this answer 中所建议的那样。 .这打开了一个全新的蠕虫 jar 头,还有我需要解决的其他问题。如果有必要,我很乐意走这条路,但我仍然想知道我是否可以让它与 boost::any 一起工作,以及是否有其他更好的解决方案。

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


大局:

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

我正在为管理任务执行的模拟框架编写任务调度程序;每个任务都是对一组数据 vector 的基本操作。例如,如果 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 编写)中,任务是静态安排的,框架根据给定的模型生成代码来运行模拟。任务的排序基于从模型定义中提取的依赖图。

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

我乐于接受建议。任何建议。

最佳答案

查看添加的详细信息后,我的第一 react 是将数据分离到多个单独的映射中,并将类型作为模板参数。例如,您将替换 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++ - 任意类型的映射 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10434144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com