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

c++ - boost::variant - 为什么“const char *”转换为“bool”?

我已声明 aboost::variant接受三种类型stringboolint. 以下代码显示我的变体接受const char*并将其转换为bool. boost::variant接受和转换不在其列表中的类型是正常行为吗?

输出:

类型:其他 -> 1
类型:字符串 -> 一些字符串

如果我从 MyVariant 中删除 bool 类型并将其更改为:

const char*不再转换为bool. 这次它被转换为string,这是新的输出:

类型:字符串 -> 一些字符串
类型:字符串 -> 一些字符串

这表示variant尝试先将其他类型转换boolstring. 如果类型转换是不可避免的并且应该总是发生,有没有办法将转换赋予string更高的优先级?

0 投票
1 回答
276 浏览

c++ - boost::variant - 为什么模板参数的优先级高于 const 字符串参数

我在以下代码中目睹了我不理解的行为。关键是,如果我声明第二个重载operator()类似于以下任一:

程序的输出是:

细绳

但是,如果我使用以下声明:

输出将是:

其他类型

有人可以解释为什么operator()(const string &other)在后一种情况下不被调用吗?

0 投票
1 回答
2676 浏览

c++ - boost::variant 实现

我只是对boost::variant' 的实现感到好奇。

它像这样工作吗?

两名成员:

  1. 表示当前存储类型的数字(即第一个模板参数为 0,第二个模板参数为 1 等)
  2. 所有可能类型的联合(当然是最大的)。

apply_visitor()

有一个switch关于表示当前存储类型的数字的语句以调用正确的重载(在最坏的情况下,这将被编译为跳转表,因此需要恒定的时间)。

我知道还有一些优化可以肯定boost::variant不需要像这里详述的那样动态分配内存,但我想我明白了。

0 投票
2 回答
589 浏览

c++ - 为什么 boost::variant 的 std::vector 会导致解析问题?

扩展这个较早的帖子,我想我会尝试捕获 astd::vector<boost::variant<double,std::string>>而不是 just boost::variant<double,std::string>,而是首先从相同的旧输入开始。

这是给定输入 'foo' 和 42.7 的输出:

出于某种我不明白的原因,解析器似乎正在为 'foo' 生成 ASCII 值并引起一些混乱。

打开 DO_VECTOR 时是否需要更改解析器?

我应该使用不同的容器吗?

代码

0 投票
1 回答
473 浏览

c++ - 识别变体类型

boost::variant通过识别其中的特定类型并将其作为成员函数参数传递给类对象,我混淆了以下问题 。考虑以下代码

我想确定在类测试中实现访问类/结构(apply_visitor)。但是,我从访问者类中实现的重载运算符调用外部成员函数,即 func3(string s) 被卡住了。

0 投票
1 回答
152 浏览

c++ - 在其他类中实现访问类

我试图在类对象中识别 boost::variant 的类型以执行关联的成员函数。考虑以下代码:

问题是我需要识别成员函数中的 Variant 类型,以便在同一个对象中调用该数据类型的相关成员函数。

0 投票
3 回答
2858 浏览

c++ - 如何实现 boost::variant 派生类?

我已经尝试了几个小时来编写一个派生自boost::variant. 但我不明白是什么问题(我不明白编译错误是什么意思)。

实现干净的boost::variant派生类的规则是什么?

为什么我要使用继承?(编辑以向@zaufi 提供更多详细信息)

  • 我想要一个空状态
  • 我想const char*接受string
  • 我想int接受long
  • 我想给出enum类型

例如,在伪 C++ 代码中,我希望:

基本代码段(在问题之上)已在不同平台上进行了测试

  • 提升 v1.33 + GCC 4.1 (Linux)
  • 提升 v1.52 + GCC 4.7 (MinGW)
  • 提升 v1.52 + Visual C++ 2010 (v10)

在我对 GCC 的两个版本的错误下方(如果它打扰某人,我可以删除两者中的一个......)



0 投票
1 回答
574 浏览

c++ - 使用 boost::spirit 时无法在 boost::variant 中转换 boost::fusion 结构

一天中的好时光!

我写了这段代码,并希望它能够被编译。

但是当我用 clang 或 GCC 编译它时,我得到一个错误。其中最有趣的部分是:

我使用 clang 3.1 或 gcc 4.7 和 boost 1.52,但我认为没关系。:)

我应该如何编辑这段代码以使其被编译?

更新

好吧,我刚刚注意到我指定的语法是左递归的,因此递归下降解析器在处理输入时可能不会停止。这可能是编译问题的原因吗?

0 投票
0 回答
262 浏览

c++ - 将数据添加到 boost property_tree

我有一个存储在 XML 中的简单树结构,boost::property_tree::ptree用于读取和提取信息。然后我使用重新创建树,std::maps以便我可以将数据存储在叶子中。这很好用,我喜欢固定树结构与数据的分离,但我觉得我重复了很多代码,如果我可以为 ptree 中的每个叶节点添加一个类,我可以大大简化我的代码。

作为我boost::variant在课堂上使用的一个可能的轻微并发症,我希望将其存储在叶子中。

我的主要问题是我是否应该尝试将动态数据添加到 ptree,其次,如果是这样,您对添加它的最佳方式有什么建议吗?

0 投票
4 回答
1994 浏览

c++ - 如何在不相关的类型上实现动态多态性(运行时调用调度)?

目标:

我想在不相关的类型上实现类型安全的动态多态性(即函数调用的运行时分派)- 即在没有公共基类的类型上。在我看来,这是可以实现的,或者至少在理论上是合理的。我将尝试更正式地定义我的问题。

问题定义:

鉴于以下情况:

  • 两个或多个不相关的类型A1, ..., An,每个类型都有一个名为 的方法f,可能具有不同的签名,但具有相同的返回类型 R;和
  • 一个boost::variant<A1*, ..., An*>对象v(或任何其他类型的变体),它可以而且必须在任何时候假设任何这些类型的一个值;

我的目标是编写在概念上等同于v.f(arg_1, ..., arg_m);在运行时调度以运行的指令,Ai::f如果其中包含的值的实际类型vAi. 如果调用参数与每个函数的形式参数不兼容Ai,编译器应该引发错误。

当然我不需要拘泥于语法v.f(arg_1, ..., arg_m):例如,类似的东西call(v, f, ...)也是可以接受的。

我试图在 C++ 中实现这一点,但到目前为止我还没有想出一个好的解决方案(我确实有很多不好的解决方案)。下面我澄清一下我所说的“好的解决方案”是什么意思。

约束:

一个好的解决方案是任何让我模仿v.f(...)成语的东西,例如call_on_variant(v, f, ...);,并满足以下约束

  1. 不需要为必须以这种方式调用的每个函数(例如)或任何可以在代码中的其他地方以多态方式处理的不相关类型列表(例如)进行任何类型的单独声明,尤其是在全局范围内;fENABLE_CALL_ON_VARIANT(f)A1, ..., AnENABLE_VARIANT_CALL(A1, ..., An)
  2. 调用时不需要显式命名输入参数的类型(例如call_on_variant<int, double, string>(v, f, ...))。命名返回类型是可以的,所以例如call_on_variant<void>(v, f, ...)是可以接受的。

遵循一个示范性的例子,希望能阐明我的愿望和要求。

例子:

这个程序的输出应该是:ABC.

最佳(失败)尝试:

我最接近所需解决方案的是这个宏:

如果本地类中只允许模板成员(请参阅此问题),这将完美地工作。有没有人知道如何解决这个问题,或者提出一种替代方法?