问题标签 [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 投票
3 回答
10322 浏览

c++ - C++ 标准库中 boost::variant 的等价物是什么?

我正在寻找 C 风格联合的替代方案。boost::variant 就是这样一种选择。标准 C++ 中有什么东西吗?

0 投票
1 回答
632 浏览

c++ - Boost.Spirit 与 Boost.Variant 和 C++11:期望零参数构造函数

我正在尝试使用 Boost.Spirit 编译一个简单的语法。我在 Arch Linux x86_64 上使用 g++ 4.7.0 和 boost 1.49.0-1.1。

这里的最终目标是汇编程序。将有多个操作数,每个操作数都有一个类。所有操作数类型一起存储在一个boost::variant类型中。

direct当它也是语法的 base_type 时,我已经成功地将这个示例编译为规则,但是引入operand规则(并使其成为基本类型)导致 g++ 4.7.0 抱怨:

我不明白为什么它应该为 寻找默认构造函数DirectOperand,因为语义操作应该使用构造函数调用它。

我尝试了很多变化,包括

甚至编写一个辅助函数来“强制”该类型,例如:

但无论我做什么,它都会抱怨缺少默认构造函数。

当我实际定义一个零参数构造函数时,我发现它已编译,但DirectOperand::value_从未改变我分配的默认值。

这是代码。它尽可能短。

0 投票
2 回答
158 浏览

c++ - 如何返回可变数量的各种类型的容器?

我的数据如下所示:

不同的文件将具有不同数量的命名列,并且每列中的值类型将在浮点数、整数和字符串之间有所不同。

我想编写一个readCols函数,向其发送列名(例如,我可能需要tokenrank列),它将指定列中的数据放入适当类型的容器中。

我的问题不在于解析文件,而在于返回包含不同类型的可变数量的容器。例如,我希望将tokenrank列分别放入vector<string>vector<int>容器中。这里的问题是我可能想要该eps列(存储在向量中),并且我不想readCols为每种可能的类型组合编写不同的函数。(容器的类型对我来说无关紧要。如果我必须只使用vectors,没问题;每个容器包含不同的类型是关键。)

我可能需要一个容纳不同类型的容器来容纳不同类型的容器。看起来Boost.Variant可能是我想要的解决方案,但我不知道如何告诉解析器我希望每列是哪种类型(我可以制作类似类型名列表的东西吗?例如void readCols(string filename, vector<variant<various types of vector>> &data, vector<string> colNames, vector<typename> convertTo))。同样,Boost.Mpl.Vector可能会解决问题,但我还是不太清楚如何判断readCols每列想要如何转换。

我至少可以想到两种解决方法:

  1. 使用读入任何容器的模板化函数分别读取每一列(container::value_type允许函数知道如何解析)。我不喜欢这种解决方案,因为文件有时很大(数百万行),因此多次解析它们会花费额外的几分钟(在计算需要约 30 分钟的程序中,运行时间的百分比可忽略不计;程序将一遍又一遍地跑)。
  2. 将所有列读入字符串容器并在调用上下文而不是解析上下文中重新转换它们。这不会那么糟糕,因为我认为我可以使用std::transformandboost::lexical_cast或 s/t 在一行中进行转换。如果我能避免2n臃肿的行,那就太好了(n=列数,通常为 2 或 3,每列 2 行来声明容器然后转换)。

与完整的通用解决方案相比,第二种解决方法可能需要我付出的努力要少得多;如果是这样,我想知道。我想第二种解决方法甚至可能更有效,但我目前主要关心的是易用性。如果我可以编写一个通用readCols函数并完成它,那就是我更喜欢的。

0 投票
0 回答
493 浏览

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

可能重复:
序列化原始 boost::variant 是否安全?

我想序列化一个 boost::variant 类型的非 POD 类。你能告诉我这是否可能并告诉我怎么做吗?

0 投票
1 回答
288 浏览

c++ - ADL 无法为用户定义的类型找到具有适当限定符的流运算符

我正在使用 Visual Studio 2010 在 Microsoft Windows 7 上编译 x64 服务,使用类似以下的Boost 变体

我摆脱那个 string_t 并用 std::string 替换它的那一天就是我给我的老板和团队买甜甜圈的那一天。但这不是我们来这里的原因...

Boost 变体支持其包含类型的流运算符,前提是该类型具有重载。所以我有:

然而,我被错误信息所困扰:

T3 指的是 string_t。

生成错误的违规代码存在于以下上下文中。它很冗长,所以你,读者,有相关的上下文信息:

我尝试删除右手限定符和引用,认为按值传递副本会取消限定符(根据共享指针可能不那么出色),并且我尝试将声明从命名空间移动到全局范围,希望 ADL 会因为某种原因捡起它(从概念上讲,我得到了 ADL,但对我来说仍然只有一点点黑魔法)。

我不知道还能做什么。除了编译器无法找到具有 const 限定 rhs 的插入运算符之外,这个 bug 的本质是什么?怎么可能,当它就在那里的时候?决议是什么?

0 投票
2 回答
1322 浏览

c++ - 在 boost::variant 中调用类型通用的方法

如果我的所有类型都boost::variant支持相同的方法,有没有办法通用地调用它(即不为 的每个方法单独调用它static_visitor)?

我试图让这样的事情起作用:

但它无法编译说'boo' : is not a member of 'boost::variant<T0_,T1,T2>'

目前,我有一些类都继承自一个接口,以便可以多态地使用它们的单个共享方法。我还希望能够通过访问者使用这些类,因为所有其他方法对于每个具体类都是唯一的。我希望boost::variant可能是在这里实现我自己的访问者机制的更好选择。是吗?

0 投票
2 回答
1028 浏览

c++ - 使用 gcc 的 boost::variant 链接器错误

我有点疯狂地试图弄清楚为什么以下内容无法编译:

这是我得到的编译器错误:

/usr/include/testing/test_code.o||在函数中'std::array<boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, 5ul>::array(std::array<boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, 5ul> const&)':|
。store.cpp :( text._ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC2ERKS6 _ [_ _ ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC5ERKS6] + 0X31)||未定义参照'boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::variant(boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_> const&)'|
||=== 构建完成:1 个错误,0 个警告 ===|

如果我更换:

和:

代码可以编译,但出于性能原因,我不想使用 boost::any。

0 投票
1 回答
1421 浏览

c++ - 具有 boost 变体递归包装器的字符串解析器

下面的代码(改编自 Spirit qi mini_xml 示例)无法编译。存在与brac具有递归属性的规则相关的错误boost::variant
但是,所有注释掉的bracdo compile 版本。

我很想知道是什么让简单的字符串解析器在这种情况下如此特别:

部分错误信息:

提前致谢。

0 投票
1 回答
334 浏览

c++ - boost 变体 istringstream 和流错误

我正在使用 Visual Studio 2010 sp1。在 Windows 7 中使用 c++ 和 boost 1.47

我有以下代码:

我也尝试将 istringstream 替换为 istream。我确实收到以下错误:

如果我声明 istringstream i; 我没有得到错误。如果我声明 istream i2,我确实会收到类似的错误;

我究竟做错了什么?

我需要 istream 或派生类的原因是我正在研究的 sql 库。具体来说,对于 mysql 实现,我需要一个 istream 或 istringstream 来调用 setBlob ...

我找到了一个临时解决方法,允许传递一个字符串并用该字符串初始化字符串流。但是,如果我的变体类型可以采用 istreamstream 或更好的 istream,那就太好了

谢谢,弗兰克

0 投票
1 回答
162 浏览

c++ - 传值认为参数是 const

Visual Studio Enterprise 2010,sp1,在 Windows 7 64 位上。提升 1.48.0。

这里开始相关代码。这些位在标头中定义。

这是在复制构造函数的主体中:

我发现的错误与 lambda 的参数列表有关。正在调用交换,我认为在该对的复制构造函数中,尝试首先从传递给 lambda 的右值分配给参数。当在 std::pair 复制构造函数中分配“value.first”时,编译器认为它是 const。但很明显,参数不是 const 限定的,mapped_type 或 key_type 不是 const 限定的,复制构造函数不是 const 方法,无论如何都不应该重要。

所以不知何故,模板参数得到了 const 限定,对于我的生活,我无法弄清楚为什么。

我认为其他东西正在使编译器绊倒,但我没有其他东西可以解决。早些时候,在我给我的源代码好好搅动之前,试图弄清楚这一点,我可以打开和关闭这个错误消息;我已经定义了一个 boost::static_visitor 派生类。没有成员,没有方法,什么都没有。这足以在我的复制构造函数中导致此错误。我无法想象如何隔离实际上问题的代码行......

有没有人认为这是编译器打嗝,并且一些未提及的更改会产生副作用?