问题标签 [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++ - boost::variant 访问者类是必需的吗?
class Visitor : public boost::static_visitor<>
我是否需要使用带有 boost::variant的访问者类?
如果不是,是否有理由不使用访问者?有理由更喜欢访客班吗?
我问这个问题是因为访问者类对于 boost::variant 的使用来说是一个多余的方面。
c++ - C++ Boost递归变体重载apply_visitor
摘要:我希望在包含递归 boost::variant 对象的类中重载 apply_visitor() 方法。
在下面包含的代码中有方法:
我想为不同的访问者重载这个方法。像这样的东西:
但问题是 PrintData 类尚未完成(请参阅下面代码中的注释)。它是在 Node 类之后定义的。所以我有两个问题(除其他外——我欢迎对这段代码进行一般性批评,该代码正在建模我想投入生产的东西)。
1)有没有办法让 apply_visitor(PrintData&) 工作?
2)我可以重新排列(递归)变体,以便所有访问者方法都在 PrintData 中,并且我不必将 apply_visitor 添加到 Node 类吗?
c++ - boost::可选引用 boost::variant 类型
我目前正在为游戏编写一些代码,其中一部分涉及创建迄今为止在游戏中发生的动作的历史记录。此历史记录存储在state_pair_t
' 对动作 ( action_t
's) 的向量中,并在执行动作后指向结果游戏状态的指针。现在我有一个函数,它从最近的时间点开始查看历史并向后迭代,直到找到某种类型的动作,然后返回对该动作的引用。no_action
现在我们决定,如果没有找到任何操作,使用 boost optional 来返回 a并用于boost::optional
处理这些应该返回值但可能没有返回值的函数可能是一个很好的设计举措。当我真正尝试实现这一点时,我遇到了一个我不明白的错误:
现在这给出了一个编译错误:
现在,如果我将其稍微更改为:
我得到另一个错误:
我不确定这些错误中的任何一个试图在这里告诉我什么。我在这里尝试做的不是一个好主意boost::optional
吗?甚至可能吗?
c++ - 新标准的特性对 C++11 中的 boost 库实现是否有重大影响?
新标准的特性对C++11中的boost库实现是否有重大影响?
鉴于可变参数模板的存在,对boost::variant
(BOOST_VARIANT_LIMIT_TYPES) 和库的某些部分特别感兴趣。boost::spirit
有没有关于这个的好文章?
c++ - boost::variant 不能同时处理字符串和 wstring
在尝试在库中添加对 UTF-8 语言环境的支持时,我将类型添加std::wstring
到boost::variant
包含值的 中。
那时,我开始在内部遇到错误boost::variant
:
Blockquote/opt/TWWfsw/libboost147/include/boost/variant/detail/variant_io.hpp:在成员函数'void boost::detail::variant::printer::operator()(const T&) const [with T = std ::basic_string, std::allocator >, OStream = std::basic_ostream >]':
/opt/TWWfsw/libboost147/include/boost/variant/variant.hpp:858: 从'typename Visitor::result_type boost:: 实例化detail::variant::invoke_visitor::internal_visit(T&, int) [with T = const std::basic_string, std::allocator >, Visitor = boost::detail::variant::printer >]'
< SNIP SNIP >
Cursor.H:84: 从这里实例化 /opt/TWWfsw/libboost147/include/boost/variant/detail/variant_io.hpp:64: 错误: 'operator<<' in '((const boost::detail ::变体::打印机 >>)this)->boost::detail::variant::printer > >::out_ <<operand'
/opt/TWWfsw/gcc44/include/c++/ostream:108: 注意:候选者是:std::basic_ostream<_CharT , _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& ( )(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits]
等。
此示例使用带有 g++ 4.4 的 boost-1.47。
该程序将输出:
3
宽字符文字
但是如果#define
删除了 并且两者string
都wstring
在变体模板参数中,则会导致相同的错误。
我的问题是,我可以创建一些能够满足这个缺失定义的东西,比如模板专业化吗?
也许定义一个将宽字符串转换为窄字符串的变体访问者?(不是一般的解决方案,但在我的情况下缩小范围会起作用)
问题来自<<
在定义两个字符串时使用变体。即使我只通过变体输出 int,它也不会编译。
c++ - 使用带有模板的访问者遍历 boost::variant 类型
我有一个持久性类,例如:
这用于持久化类型,例如:
我无法更改上面的 API,我想对这些异构类型执行批量操作。我按照他们自己的教程使用boost::variant并取得了部分成功:
然后,所有(许多)异构类型的批量操作旨在简单地完成:
WriteRecordVisitor 无法编译。错误是
这显然看起来不对,但我不知道是什么原因造成的。
我想要么让 WriteRecordVisitor 方法工作,要么能够遍历向量(获得 boost::variant<...>)并以某种方式(再次模板,可能)使用 boost::get 传递每个适当的元素( Record<A>, Record<B>, ...) 到 Writer::write(Record<T>)。
我还想避免为每种可能的异构类型定义访问者运算符,因为这会破坏最初使用异构容器进行简化的最初目标。
我在 Linux 3.5.4 Fedora 17 上使用 gcc 4.7.2。感谢任何帮助 - 我在发布之前确实阅读了 boost::variant 上的所有其他帖子。
boost - 推送到 boost::variant 的列表
我有一boost::variant
组具有本质不同的非默认构造函数原型的非默认可构造(甚至可能是不可移动/不可复制和不可复制/移动可构造)类,如下所示:
我希望,这std::list::emplace_back
允许我构造和插入(在单个操作中)新对象(所有A
, B
,C
类型)到列表中,即使它们有T & operator = (T const &) = delete;
/T & operator = (T &&) = delete;
和T(T const &) = delete;
/ T(T &&) = delete;
。但是,如果构造函数是非转换的,我该怎么办?即有多个参数。或者,如果两个不同变体的底层类型具有模棱两可的构造函数原型,我应该怎么做?在我看来,这是针对 C++11 标准的新特性实现库的缺陷boost::variant
,如果有的话可以用来解决问题。
我专门询问了std::list
和叠加,因为据我所知boost::variant
,它们都在内部以某种形式实现了pimplboost::variant
习惯用法(例如,目前是通过临时堆备份方法设计的)。
c++ - 无论类型如何,在 boost::variant 上调用函数?
我有一个有模板的类:
该类有一个void Process(void)
方法,所以,我认为它应该是可调用的,不管类型如何,返回值是 void 并且没有参数。
至于现在我有这个代码来调用我的应用程序中的每个帧:
是否可以执行以下示例中的函数 Process() ?
如果是,如何?
c++ - boost 变体支持多少种数据类型?
考虑以下:
这里可以接受多少个模板参数?
c++ - 嵌套提升变体类型以增加类型限制?
考虑:
这将我的类型可以容纳的类型数量的限制pow(BOOST_VARIANT_LIMIT_TYPES, L)
扩展到,其中L
是嵌套的级别数。
这(在某种程度上)是一个可接受的解决方案,还是只是一个糟糕的 hack?那里有更好的解决方案吗?也许老式union
的更合适?