问题标签 [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 迭代器
我想创建一个函数,它可以采用不同类型的迭代器来存储相同类型的对象:
第一个是std::map
包含shared_ptr<Foo>
(typedef-ed as FooMap
),另一个是std::list
也包含shared_ptr<Foo>
(FooList
)。
我真的很喜欢MSalters 为类似问题建议的解决方案,并尝试实现boost::variant
迭代器,该函数将获取迭代器作为从第一个迭代到第二个的参数。
我的函数看起来像这样(简化了很多):
FooIterator 和访问者定义如下:
我从这封邮件的附件中得到了上述大部分内容。根据 MSalters 的回答,该解决方案还使用了适配器和策略,这似乎有点太多了,所以我不想简单地复制该代码。特别是因为我只了解其中的一部分。
使用上面的代码,我从 VS2008 得到以下编译器错误(这只是总共 160 行的前几行,我认为在这里发布有点太多了;但是我很乐意添加它们如果有人想要全部查看):
我究竟做错了什么?
c++ - 为什么 boost::variant 不提供运算符 !=
给定两个相同的boost::variant
实例a
和b
,该表达式( a == b )
是允许的。
但是( a != b )
似乎未定义。为什么是这样?
c++ - 序列化原始 boost::variant 是否安全?
boost::variant声称它是一种值类型。这是否意味着只要简单地写出 boost::variant 的原始表示并稍后将其加载回来是安全的,只要它只包含 POD 类型?假设它将被相同编译器和相同版本的 boost 在相同架构上编译的代码重新加载。
此外,(可能)等效地,可以在共享内存中使用 boost::variant 吗?
c++ - Boost.Any 与 Boost.Variant
我无法在 Boost.Any 和 Boost.Variant 之间进行选择。
我应该什么时候使用每一个?
各自的优点和缺点是什么?
我基本上希望从外部来源存储一些状态。
c++ - 存储双精度和整数混合集合的最有效方法
我需要在 C++ 中存储整数和双精度值的集合(代表名义值和实值数据)。我显然可以将它们全部存储在 a 中std::vector<double>
,但这感觉有点不对,并且没有获得美学加分。
我也可以根据多态性来做一些事情,但我还需要集合非常高效:在集合中存储和检索数据都应该尽可能快。我发现很难判断这样的解决方案是否会最大限度地提高效率。
我还找到了boost::variant,这在这里可能会有所帮助。
附加信息:集合中的项目数将很小(<100)并且在初始化集合时已知。
总结:我显然可以用无数种方法解决这个问题,但是当(i)效率非常重要并且(ii)我也想编写一些不错的代码时,我不确定什么是一个好的解决方案。我在这里最好的选择是什么?
编辑,附加信息:该集合代表较大数据集中的“行”,其元素代表某些“列”的值。行的属性是已知的,因此知道什么样的数据存储在哪个位置。我所说的“效率”主要是检索某个列的 int/double 值的效率,尽管快速设置值也很重要。我有一些函数可以对需要尽快检索的数据进行操作。例子:
到目前为止,经过更多思考和阅读建议,似乎将 int 列和 double 列存储在两个单独的向量中是一个可靠的解决方案。然后,该集合Row
可以只定义两个不同的成员来检索函数可以使用的名义数据和真实数据。
我猜只是存储为 avector<double>
也可以,但这取决于 double 和 int 之间的转换速度有多快(这可能令人印象深刻)。
很抱歉一开始有点不清楚,我希望现在更清楚,我可以对此事有更多的想法。
c++ - 迭代 boost::variant 中的类型
我正在使用 boost 变体来保存一些生成的类型,现在我的代码生成器创建了一个带有类型的标头和一个能够保存它们的变体。在初始化时,我想迭代变体中允许的类型,而不是变体目前持有的类型。
我可以用变体做到这一点吗?
c++ - boost::variant 的问题,链接器给出段错误
我有一个包含 7 种类型的 boost 变体。当我尝试使用最后两种类型时,链接器会出现段错误。我在 64 位 linux 机器上使用 g++(SuSE Linux 上的 gcc 版本 3.3.3),我得到的错误是
我将类型放入的顺序无关紧要,最后两个在我尝试使用它们时会导致段错误。任何想法为什么会发生这种情况?
代码:
ClassX::Ptr 是指向该类的 boost 共享指针。Ptr 在类本身内部定义为 typedef,如下所示
当我尝试使用 boost 变体中的最后两种类型时
如果我将 boost::variant 定义为(交换 Class6 和 Class1)
然后在编译此代码时出现段错误
c++ - 将成员函数添加到 Boost.Variant
在我的 C++ 库中,我有一个类型boost::variant<A,B>
和许多算法将这种类型作为输入。我在这种类型上有全局函数,而不是成员函数,比如void f( boost::variant<A,B>& var )
. 我知道这也可以用模板来实现,但这不适合我的设计。
我对这种编程风格非常满意:
但是这个库的一些用户并不习惯,而且由于 Boost.Variant 的概念被类型定义所隐藏,他们觉得调用v.f()
.
为了实现这一点,我可以想到两种可能性:1)覆盖boost::variant
和 2)重新实现boost::variant
和添加我自己的成员函数。我不确定这些想法是否好。你能给我一些帮助吗?还有其他可能性吗?
c++ - boost::variant 的迭代器
嘿那里,
我正在尝试使现有代码适应 boost::variant。这个想法是对异构向量使用 boost::variant。问题是其余代码使用迭代器来访问向量的元素。有没有办法将 boost::variant 与迭代器一起使用?
我试过了
但它没有用。
编辑:谢谢你的帮助!但是在我的设计中,我需要从列表中获取一个元素并将其传递给代码的其他部分(这可能很糟糕,因为我使用的是 GSL)。使用迭代器的想法是我可以将迭代器传递给一个函数,该函数将对来自该特定元素的返回数据进行操作。我看不到如何使用 for_each 来做到这一点。我需要做类似的事情:
谢谢!
c++ - 如何使用 Boost.Variant 遍历一系列有界类型
如何遍历 v 的元素以访问 a 和 b 对象?
我可以用 boost::get 做到这一点,但语法真的很麻烦。:
我尝试使用访问技术,但没有走得太远,代码不起作用:
编辑 1
一个骇人听闻的解决方案是: