问题标签 [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 回答
1469 浏览

c++ - 谷歌测试 EXPECT_EQ 和 boost::make_recursive_variant

我有一个提升递归变体,如下所示。当我使用断言比较两个递归变体对象时,它工作正常,但使用 EXPECT_EQ,它会产生编译错误。

boost/v1.46.1/include/boost/variant/detail/variant_io.hpp:64: error: no match for 'operator<<' in '((const boost::detail::variant::printer > >*)this )->boost::detail::variant::printer >>::out_ <<操作数'</p>

0 投票
4 回答
22306 浏览

c++ - boost::variant 用法

我正在通过 wxWidgets 开发 GUI 应用程序。它有 2 个部分:GUI 部分和“逻辑”部分。我想让逻辑部分完全独立于 wxWidgets。但是 GUI 中的一个组件返回 wxVariant,我需要在逻辑部分使用它。

所以我正在寻找一种将 wxVariant “转换”为 boost::variant 的方法

wxVariant 的工作方式如下:

所以我在想类似的东西

是否可以像这样使用 boost::Variant (或 boost::Any)?

0 投票
1 回答
723 浏览

c++ - 与自动发电机相关的 Boost-spirit-karma 和 boost-variant “概念”

我需要std::vector<boost::variant<..>>用其他对象提供的装饰反序列化 a 。

“装饰”启用的一件事是向量中的一个空条目。我在实际实施中遇到了障碍。但是,我设法将其收缩包装。编译的代码:

有问题的更改试图实现“未定义”类型以及所需的概念。

如果我注释掉这karma::generate一步,std::cout是一个有效的表达式(Boost::variant OutputStreamable)。Spirit 要求为生成器提供OutputStreamable(spirit::karma OutputStreamable) 类型,并且上面的变体应该是OutputStreamable,因为我已将该undefined类型OutputStreamable设置为无操作。

是什么赋予了 ?:(

当使用具有> 2级模板间接的库时,我真的开始质疑 C++ 模板机制是否值得。也许我应该回到直接-c。

编辑1:

好的,Clang 给了我一个合理的first错误......

error: no type named 'properties' in 'boost::spirit::karma::no_auto_mapping_exists'

现在我必须弄清楚如何将 undefined 映射为无操作以获得干净的转换。这个精神文档条目(特别是这个)描述了我需要研究的内容。是否存在由 Spirit 提供的通用未定义类型或在 boost 中定义的类型,该 Spirit 已经映射为 no-op ?

编辑2:

std::vector<boost::optional<boost::variant<..>>>开始看起来很有吸引力,因为精神为他们提供了类型推断。

0 投票
1 回答
1237 浏览

c++ - 为什么我不能用 boost::variant 访问这个自定义类型?

以下代码:

产生以下错误。

我最初只是尝试使用一个非常简单的 A,但我试图满足Boost.Variant 对 BoundedTypes的所有要求。A曾经是

访问者使用字符串值可以正常工作,但甚至无法编译访问 A 的尝试。我使用的是 gcc-4.4.5。有任何想法吗?

0 投票
1 回答
273 浏览

c++ - 在 boost 变体中使用相同的数据类型

我们可以显式类型转换要存储在 boost varint 中的值吗?

例子:

在这里,我希望 which() 函数重新运行 3,但它始终重新运行 0。有没有办法直接更改 which_ 中的值(类变体中的私有变量)或显式指定要使用的数据类型?

问候安基思

0 投票
1 回答
1488 浏览

boost - boost::static_visitor 的要求

我对将 boost::static_visitor 应用于变体和结构有点困惑。我在下面包含了一个测试用例。对于“s_visitor”中注释掉的部分,我不明白为什么会出现以下错误消息或如何修复它:

apply_visitor_unary.hpp:72:错误:“struct s1”没有名为“apply_visitor”的成员</p>

感谢您提供任何帮助和/或澄清。

0 投票
1 回答
949 浏览

c++ - 编译文件的变体问题

我尝试从此页面编译以下代码: http ://www.pdc.kth.se/training/Talks/C++/boost/libs/variant/doc/sample.html

在“二叉树实现”下,我遇到了大量无法解决的错误。我正在使用带有代码块的 gcc 3.4.5。

以及编译期间的回溯:

0 投票
2 回答
745 浏览

c++ - 在这种情况下,如何决定堆栈、堆和 boost::pool 分配?

我有一个类使用 boost::variant 来存储双精度或字符串,如下所示:

对于我正在玩的玩具解释器,它应该是不可变的值类型。起初,通过 const 引用传递它并按值返回似乎是一个好主意,并始终将它分配在堆栈上,因为我希望它被视为原语。但是,后来我看到它的大小是 40 字节(主要是由于 std::string 的 sizeof),我有点担心。我知道我不应该在堆栈上分配大块内存,但是多大才算太大?

此外,每次返回时复制 40 个字节,特别是因为该值是不可变的,甚至不需要复制,这似乎有点浪费。

常规堆分配选项似乎不太有吸引力,因为我每秒可以有数千个这样的分配/解除分配。

我想出的最后一个选择是在需要时使用 boost::pool 来分配这些对象,并使用 boost::shared_ptr 来管理它们的生命周期。然而,因为解释器负责内存分配(内存分配的类型将是作为模板参数传递给解释器的策略),这意味着值类必须知道解释器,这会使事情稍微复杂化.

所以这些是问题:

  • 在这种情况下我应该怎么做,为什么?
  • 在堆栈上分配“太大”有多大?我敢肯定,这取决于分配的频率以及必须复制的频率。

谢谢。

0 投票
1 回答
2478 浏览

c++ - Boost Variant:如何对 JSON 建模?

我正在尝试将使用 Boost Spirit 存储 JSON 对象的 JSON 字符串解析为递归数据结构:

这是我的代码:

编译时出现错误:

此外,如何安全地将 JsonValue 转换为 JsonObject?当我尝试这样做时:

这会导致运行时异常/致命失败。

任何帮助是极大的赞赏。

编辑:

按照@Nicol 的建议,我得出了以下代码:

我可以像这样简单地处理 JsonObject 和 JsonArray:

只是发布,以便每个人都可以从中受益。

0 投票
1 回答
1624 浏览

c++ - 为什么 boost::spirit::qi::parse() 没有设置这个 boost::variant 的值?

当试图将文本解析为 boost::variant 时,变量的值不会改变。解析器本身似乎工作正常,所以我的假设是我对变体代码做错了。

我正在使用 boost 1.46.1,以下代码在Visual Studio 2008 中编译。

第一次更新

hkaiser 指出,规则和语法模板参数不能是Variantbut Variant()
这有点“进一步”,因为我现在在boost_1_46_1\boost\variant\variant.hpp(1304). 评论说:

所以显然表达式的属性(qi::double_ | +qi::char_)不是boost::variant<double, std::string>。但那是什么?

第二次更新

使用typedef boost::variant<double, std::vector<char>> Variant;适用于解析器。但是,这并不像 std::string 那样容易使用...