问题标签 [boost-variant]

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 投票
1 回答
1503 浏览

c++ - 如何加载序列化的 boost::variant?

我无法使用boost::serialization,因为它具有库依赖项,所以我试图自己找出一种方法。这是否意味着从boost::serialization.

在阅读了类似问题的答案后,我查看了boost/serialization/variant.hpp并找到save()了对我来说直截了当且易于理解的函数。

然而,这个load()函数看起来更复杂:有一个涉及 load()andvariant_impl<types>::load()和一个递减which参数的递归。因此,显然代码会迭代每种类型的变体,以便将其int which转换为类型。其余的超出了我的范围。

我知道 boost 有很多代码可以使其可移植,所以也许有一种不太便携但更简单的方法来做到这一点?

0 投票
1 回答
2015 浏览

c++ - 使用 mpl::vector 定义 boost::variant 类型

我正在使用该库boost::variant来存储大量类型。随着类型的数量越来越多,我很快就会达到 20 种的限制。在文档中,似乎可以使用 a 定义变体mpl::vector,它允许超过 20 种类型(如果我是正确的,最多 50 种)。我试图像这样替换我的变体定义:

我直接把我的代码。大多数类型是包含很少数据的结构。

编译时,我得到一个奇怪的:

以前的变体定义工作正常,所以我很惊讶我的替换不起作用。我是新手,mpl所以也许我错过了一些东西 - 但找不到什么!我过得好吗?

提前致谢。

0 投票
3 回答
237 浏览

c++ - boost::variant 获取最后访问的类型

这就是我想要做的:

我知道我可以使用 get,但我希望能够在不指定类型的情况下执行此操作。我可以用 apply_visitor 和一个访问者对象来做到这一点,但我想知道是否有更简单的方法。

0 投票
1 回答
1274 浏览

c++ - boost::variant 单一存储保证

我的目标是保证所有变体类型的单一存储:根据Boost::variant 的“永不空”保证,我们需要覆盖 boost::has_nothrow_copy每个有界类型。但是稍后文档提到了一些内容'boost::blank',如果绑定了该类型,则变体将设置该值,而不是尝试不抛出默认的复制构造函数。

不清楚的是,如果在有界类型列表中添加 boost::blank 将避免覆盖/专门has_nothrow_copy 化其他类型的要求?

0 投票
1 回答
8658 浏览

c++ - 使用 lambda 进行变体访问的最佳方法

我想用 lambda 内联对变体类型的访问。目前我有以下代码:

然而,这种方法的主要缺点是它取决于变体类型参数的顺序,并且不会像在编译时那样检测未处理的boost::static_visitor类型

我可以充分利用这两种方法吗?


研究 RMartinho 的出色答案,我正在尝试解决这个错误,似乎变体认为 operator() 调用是模棱两可的(我使用的是 g++ 4.5.1,就像它看不到 lambda 运算符.

看这个问题request for member `...' is ambiguous in g++,似乎 c++ 不喜欢多重继承作为提供多重重载的一种方式(即使调用由于不同的签名而完全没有歧义)

这给了我大约一堆模板提升错误,但不同的部分是:

这是整个错误,以防我遗漏一些其他相关信息:

结论:

我想添加这个实用程序的最终版本,包括测试:

lambda_visitor.h

0 投票
2 回答
1619 浏览

c++ - 使用 boost visitor 在类型之间进行转换

假设我有一个

在这个对象中,我保存来自数据库的数据,这些数据通常是整数或文本,但有时是以文本形式存储在数据库中的时间。所以我想知道我是否可以创建一个访问者,当访问带有字符串的变体对象时,它会返回一个“tm”类型的结构。像这样的东西:

然后为了使用它:

问题是,我不想在访问者中创建 tm 结构并弄乱一些共享指针和东西。我更喜欢给访问者一个已经创建的,并且在里面只是为了被初始化。类似于(在使用意义上):

访问者将使用 strptime 初始化我的结果 tm 结构,如果转换为 returnCode 出现问题,甚至会返回。有谁知道如何做到这一点?我可以以某种方式定义带有两个参数的访问者......或者其他什么?

0 投票
1 回答
1609 浏览

c++ - 强大的 boost::variant 序列化

我在我的应用程序中使用boost::variantboost::serialize。序列化模块内置了对序列化变体的支持,因此:

作品。但是,我的问题是序列化不健壮。根据我的应用程序的编译方式,变体的元素可能会发生变化。目前,序列化模块似乎只是嵌入了“活动”变体类型的索引;如果变体更改为,例如,这是一个问题boost::variant<double,string>

任何人都可以提出改进方法,以便序列化/反序列化工作,以便已序列化的类型是boost::variant. (因此,在上述情况下boost::variant<int,double> u(3.14),可以取消序列化为boost::variant<double,std::string>. 我知道这可能需要我提供其他信息,例如类型的字符串化形式。

0 投票
1 回答
919 浏览

c++ - boost 变体析构函数导致分段错误

我在使用 Boost 变体时遇到了问题。当变体被破坏时,我遇到了分段错误。

奇怪的是,只有当我没有激活编译器的优化(在我的例子中是 GCC)时,才会发生这种分段错误。例如,在 O1、O2、O3 模式下,我运行我的代码没有问题。

我的变体是这样定义的:

变体的所有元素都是一些延迟的。Deferred 构造允许对象的延迟构造。这似乎是在访问其字段之一之前未构造该对象。真实对象由 shared_ptr 支持。

并且由于破坏了父级而发生了错误:

当指令向量被删除时,当变量的删除发生在这个特定的函数时,就会发生分段错误:

0x0000000000d71972 in boost::variant < eddic::Deferred < eddic::FunctionCall, std::shared_ptr < eddic::FunctionCall >>, eddic::Deferred >, eddic::Deferred < eddic::Declaration, std::shared_ptr < eddic::Declaration> >, eddic::Deferred < eddic::Assignment, std::shared_ptr < eddic::Assignment > >, eddic::Deferred < eddic::If, std::shared_ptr < eddic::If > > , eddic::Deferred < eddic::While, std::shared_ptr < eddic::While> >, eddic::Deferred < eddic::Foreach, std::shared_ptr < eddic::Foreach> >, eddic::Deferred < eddic::For, std::shared_ptr < eddic::For> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail ::variant::void_>::using_backup() const ()

编辑 2:删除 recursive_wrapper 和 intrusive_ptr 进行测试后,错误现在是 boost 的断言:Boost.Variant internal error: which out of range。

破坏变体是否有一些限制?就像我们不能放入变体中的某种类?

在此先感谢您提供与此问题相关的任何想法

编辑:它是否来自变体包含多次延迟、延迟、...的事实?

0 投票
1 回答
1084 浏览

c++ - Boost.Variant、Boost.MPL:如何附加类型?

我查看了这个基于 boost.Any 的 grate 代码,不禁想知道我们是否可以使用Boost.Variant代替。我想知道这样的 API 是否可行:

这意味着最后编译器必须编译类似:

更新:

我尝试了什么(基于此Variant 文档和此MPL 演示文档):

但它无法编译并出现 2 个相同的错误:

0 投票
1 回答
1123 浏览

c++ - Boost::Variant 和其中的 function_types:如何将函数放入 Boost::variant?

歌词:

我尝试通过 MPI 实现一个任务池。所以我需要某种 RPC,但它可以在我程序的不同部分之间工作,这意味着处理器 A 希望处理器 B 使用参数 D 调用函数 C。我们不能像处理线程那样在进程之间传递指向函数的指针,所以我们需要一些包装容器来保存每个流程实例的函数指针。全部在一个源文件\一个程序中......所以我开始想知道如何在容器中存储具有不同签名的功能对象。我当时的 API 想法是错误的 - 最好在该池构造中定义函数池中的所有函数(至少它应该更容易实现)。但是在实施时我遇到了下一个麻烦:

问题:

这样的简单代码(function_typesmpl::vectorvariant):

不会编译落入:

查看源代码,我们看到:

这个代码块:

所以我想知道:如何解决这个错误?

我也试过:

失败了:

关于如何制作 boost.variant 保持功能的任何想法?

当然,我们可以像这样使用指向函子的共享指针:

它会编译,但生成的 API 很糟糕——你必须 1)为你想要使用的所有函数创建仿函数(意味着限制当前进程范围的使用);2)使用shared_pointers,所以我什至不知道如何以这种方式调用嵌套的函数(简单的第一个猜测(*a)(22);就是不会编译=(并且API开始像我们使用Boost.Any那样糟糕)。