问题标签 [boost-any]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1396 浏览

c++ - 使用函数的事件系统好主意?

我做了一个模块系统,如下所示:

真的很简单,很容易理解。第一个缺点是没有“remove_event”,但是为了允许它(如果我需要它),我可以只返回一个 std::function(在 set_event 方法中),它在调用时会删除处理程序,所以如果用户想要删除事件,只需调用返回的处理程序:

但我很好奇这是否是一个好的设计?或者我会突然发现使用我的方法的非常大的缺点并且需要重写大多数代码?我可以说“trigger_event”方法也将用作模块之间的消息系统,就像 JavaScript 库 jQuery 方法:“bind”允许的那样。一个例子:

在大多数情况下,这是一种公认​​的设计吗?我想要一种非常灵活的方法,因此我的想法是使用 boost::any,但总的来说这是一个好主意(可扩展性、性能、灵活性)吗?

0 投票
5 回答
384 浏览

c++ - 如何将“任何类型的数据”传递给 C++ 中的函数

假设我有一个类处理程序,其中包含一些子类,如 stringhandler、SomeTypeHandler、AnotherTypeHandler。类 Handler 将方法“handle”定义为所有子类的公共接口。对于不同的处理程序,“处理”的逻辑当然是完全不同的。

所以我需要做的就是将任何值传递给 handle 方法。然后,特定的类可以将“任何东西”转换为他们期望的类型。

基本上我需要的是类似于 java 类 Object :D

我尝试的第一件事是 a void*,但显然你做不到B* someB = dynamic_cast<B*>(theVoidPointer),所以那里没有运气。

我的第二个想法是使用boost::any. 但是,使用 boost::any 的要求是该值必须是可复制的,而我的数据并非如此。

有什么想法可以让它发挥作用吗?

谢谢

编辑:请注意,我知道我可以使用一个根本没有成员的 SomeData 类,并让我的数据成为它的子类,但我正在寻找一种更通用的方法,它不需要我制作自己的包装类。

0 投票
1 回答
781 浏览

c++ - 任意类型的映射向量

我需要存储一个不同类型的列表向量,每个向量都由一个字符串标识符引用。现在,我使用std::mapwithstd::string作为键和boost::any值(示例实现在这里发布)。

尝试对所有存储的向量运行方法时,我遇到了困难,例如:

我的问题:

  • 是否可以转换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)访问它们,因此上述问题。

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

0 投票
1 回答
693 浏览

c++ - 可以提升::any_cast(any&) 加速?

它看起来像调用boost::any_cast<T>(any&)一些昂贵的类型检查来确保强制转换是有效的。具体来说,它调用执行以下测试以确保强制转换是合法的:

std::strcmp(操作数->type().name(), typeid(ValueType).name()) == 0

如果强制转换是合法的,那么代码会执行一个 static_cast。

这对于调试模式似乎很有用,但对于生产代码来说却相当慢。有没有办法跳过strcmp?

0 投票
1 回答
466 浏览

c++ - 使用 `(boost::any a)` 而不是 `(const boost::any& a)` 来防止引用到引用

首先是我们的新函数对象 contains_t 的定义。它可能继承自辅助类 std::unary_function(C++ 标准库的一部分,旨在促进正确的 typedef 的创建)并自动定义参数和结果类型,但为了清楚起见,所需的 typedef 是明确提供。参数类型已从 const boost::any& 更改为 boost::any,以避免潜在的引用到引用,这是非法的。实现和之前一样,只是这里放在了函数调用操作符中。

为什么以下实现有可能接收引用到引用?

谢谢

0 投票
4 回答
279 浏览

c++ - 返回不同类型变量的单个 get 方法

我想创建一个具有单个 get 模板方法的类,该方法将接收 std::string 以在 std::map 中找到正确的变量并返回它。

std::map 应该存储任何类型的变量,所以我使用了 boost::any,到目前为止 std::map 看起来像这样:

对于 get 函数,我尝试了类似的方法:

但不走运,我的问题是,这甚至可能吗?如果是这样,怎么做?

基本思想是我不想为我的类中的每个特定变量创建一个特定的方法,所以其他类不需要知道它的每个 get 方法。

谢谢!

ps:对于任何问我为什么要这个的人,这里是它的简历,我有很多算法,它们会按照一定的顺序运行,并且它将用于最后一个已经运行的算法。所以,我想要的是制作一个 xml 文件,它将告诉哪些算法将运行,以何种顺序以及它将使用来自另一个算法的哪些数据。

因此,例如,算法 A 有一个名为“阈值”的变量,算法 B 需要该信息,因此,通常它必须使用 A.getThreshold 之类的东西从 A 询问它,但据我所知,我可以t 在字符串中调用一个对象函数(来自 xml 文件),所以我的解决方案是只有一个 get 函数,我传递我想要的变量名,该函数会将它返回给我。

0 投票
2 回答
1031 浏览

c++ - boost::any 是否保存副本或参考/指针?

下面的代码安全吗?

0 投票
2 回答
1860 浏览

c++ - 获取指向 boost::any 内容的 void* 指针

我正在使用一个外部库,它有一个接受 void* 的方法

我希望这个 void* 指向一个包含在 boost::any 对象中的对象。

是否可以获取 boost::any 对象的内容地址?

我正在尝试玩 myAny.content 但到目前为止还没有运气!我希望 dynamic_cast 或 unsafe_any_cast 的某种组合能给我我需要的东西。

谢谢!

0 投票
1 回答
2272 浏览

c++ - 在 boost::property_tree 中添加 boost::any 可能吗?

我正在尝试将 boost::any 类型存储到 boost 属性树。这是一些可运行的示例:

这不起作用,可能出于同样的原因 boost::any 不可序列化。但我看到我可以查询anyVar.type(),但我不知道可以用它做什么。是否可以以某种方式使用auto或其他方式将数据添加到属性树,而无需在此处显式编码固定数量的已知类型?也欢迎使用 C++11/C++0x 方法。

这是我得到的错误:

0 投票
1 回答
617 浏览

c++ - 将 'double*' 转换为 'boost::any*'

我有一个可变boost::any*项目。我的要求是:

使用可以是 int、double 或任何其他数据类型的值列表分配项目。但是在给定的时间,数据类型将是唯一的。

问题:

对于单个值,我可以使用 items[index] = value; 但是,如果我这样做 item = values; 其中 values 是一个双精度数组,它不能自动转换。另外,如果我使用

我收到“boost::bad_any_cast”:使用“boost::any_cast”转换失败。

关于如何将双数组转换为数组的一些提示将非常有用boost::any