问题标签 [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.
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>
c++ - boost::variant 用法
我正在通过 wxWidgets 开发 GUI 应用程序。它有 2 个部分:GUI 部分和“逻辑”部分。我想让逻辑部分完全独立于 wxWidgets。但是 GUI 中的一个组件返回 wxVariant,我需要在逻辑部分使用它。
所以我正在寻找一种将 wxVariant “转换”为 boost::variant 的方法
wxVariant 的工作方式如下:
所以我在想类似的东西
是否可以像这样使用 boost::Variant (或 boost::Any)?
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<..>>>
开始看起来很有吸引力,因为精神为他们提供了类型推断。
c++ - 为什么我不能用 boost::variant 访问这个自定义类型?
以下代码:
产生以下错误。
我最初只是尝试使用一个非常简单的 A,但我试图满足Boost.Variant 对 BoundedTypes的所有要求。A曾经是
访问者使用字符串值可以正常工作,但甚至无法编译访问 A 的尝试。我使用的是 gcc-4.4.5。有任何想法吗?
c++ - 在 boost 变体中使用相同的数据类型
我们可以显式类型转换要存储在 boost varint 中的值吗?
例子:
在这里,我希望 which() 函数重新运行 3,但它始终重新运行 0。有没有办法直接更改 which_ 中的值(类变体中的私有变量)或显式指定要使用的数据类型?
问候安基思
boost - boost::static_visitor 的要求
我对将 boost::static_visitor 应用于变体和结构有点困惑。我在下面包含了一个测试用例。对于“s_visitor”中注释掉的部分,我不明白为什么会出现以下错误消息或如何修复它:
apply_visitor_unary.hpp:72:错误:“struct s1”没有名为“apply_visitor”的成员</p>
感谢您提供任何帮助和/或澄清。
c++ - 编译文件的变体问题
我尝试从此页面编译以下代码: http ://www.pdc.kth.se/training/Talks/C++/boost/libs/variant/doc/sample.html
在“二叉树实现”下,我遇到了大量无法解决的错误。我正在使用带有代码块的 gcc 3.4.5。
以及编译期间的回溯:
c++ - 在这种情况下,如何决定堆栈、堆和 boost::pool 分配?
我有一个类使用 boost::variant 来存储双精度或字符串,如下所示:
对于我正在玩的玩具解释器,它应该是不可变的值类型。起初,通过 const 引用传递它并按值返回似乎是一个好主意,并始终将它分配在堆栈上,因为我希望它被视为原语。但是,后来我看到它的大小是 40 字节(主要是由于 std::string 的 sizeof),我有点担心。我知道我不应该在堆栈上分配大块内存,但是多大才算太大?
此外,每次返回时复制 40 个字节,特别是因为该值是不可变的,甚至不需要复制,这似乎有点浪费。
常规堆分配选项似乎不太有吸引力,因为我每秒可以有数千个这样的分配/解除分配。
我想出的最后一个选择是在需要时使用 boost::pool 来分配这些对象,并使用 boost::shared_ptr 来管理它们的生命周期。然而,因为解释器负责内存分配(内存分配的类型将是作为模板参数传递给解释器的策略),这意味着值类必须知道解释器,这会使事情稍微复杂化.
所以这些是问题:
- 在这种情况下我应该怎么做,为什么?
- 在堆栈上分配“太大”有多大?我敢肯定,这取决于分配的频率以及必须复制的频率。
谢谢。
c++ - Boost Variant:如何对 JSON 建模?
我正在尝试将使用 Boost Spirit 存储 JSON 对象的 JSON 字符串解析为递归数据结构:
这是我的代码:
编译时出现错误:
此外,如何安全地将 JsonValue 转换为 JsonObject?当我尝试这样做时:
这会导致运行时异常/致命失败。
任何帮助是极大的赞赏。
编辑:
按照@Nicol 的建议,我得出了以下代码:
我可以像这样简单地处理 JsonObject 和 JsonArray:
只是发布,以便每个人都可以从中受益。
c++ - 为什么 boost::spirit::qi::parse() 没有设置这个 boost::variant 的值?
当试图将文本解析为 boost::variant 时,变量的值不会改变。解析器本身似乎工作正常,所以我的假设是我对变体代码做错了。
我正在使用 boost 1.46.1,以下代码在Visual Studio 2008 中编译。
第一次更新
hkaiser 指出,规则和语法模板参数不能是Variant
but 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 那样容易使用...