问题标签 [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 - 为什么“const char *”转换为“bool”?
我已声明 aboost::variant
接受三种类型string
:bool
和int
. 以下代码显示我的变体接受const char*
并将其转换为bool
. boost::variant
接受和转换不在其列表中的类型是正常行为吗?
输出:
类型:其他 -> 1
类型:字符串 -> 一些字符串
如果我从 MyVariant 中删除 bool 类型并将其更改为:
const char*
不再转换为bool
. 这次它被转换为string
,这是新的输出:
类型:字符串 -> 一些字符串
类型:字符串 -> 一些字符串
这表示variant
尝试先将其他类型转换bool
为string
. 如果类型转换是不可避免的并且应该总是发生,有没有办法将转换赋予string
更高的优先级?
c++ - boost::variant - 为什么模板参数的优先级高于 const 字符串参数
我在以下代码中目睹了我不理解的行为。关键是,如果我声明第二个重载operator()
类似于以下任一:
程序的输出是:
细绳
但是,如果我使用以下声明:
输出将是:
其他类型
有人可以解释为什么operator()(const string &other)
在后一种情况下不被调用吗?
c++ - boost::variant 实现
我只是对boost::variant
' 的实现感到好奇。
它像这样工作吗?
两名成员:
- 表示当前存储类型的数字(即第一个模板参数为 0,第二个模板参数为 1 等)
- 所有可能类型的联合(当然是最大的)。
apply_visitor()
:
有一个switch
关于表示当前存储类型的数字的语句以调用正确的重载(在最坏的情况下,这将被编译为跳转表,因此需要恒定的时间)。
我知道还有一些优化可以肯定boost::variant
不需要像这里详述的那样动态分配内存,但我想我明白了。
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 时是否需要更改解析器?
我应该使用不同的容器吗?
代码
c++ - 识别变体类型
boost::variant
通过识别其中的特定类型并将其作为成员函数参数传递给类对象,我混淆了以下问题 。考虑以下代码
我想确定在类测试中实现访问类/结构(apply_visitor)。但是,我从访问者类中实现的重载运算符调用外部成员函数,即 func3(string s) 被卡住了。
c++ - 在其他类中实现访问类
我试图在类对象中识别 boost::variant 的类型以执行关联的成员函数。考虑以下代码:
问题是我需要识别成员函数中的 Variant 类型,以便在同一个对象中调用该数据类型的相关成员函数。
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 的两个版本的错误下方(如果它打扰某人,我可以删除两者中的一个......)
c++ - 使用 boost::spirit 时无法在 boost::variant 中转换 boost::fusion 结构
一天中的好时光!
我写了这段代码,并希望它能够被编译。
但是当我用 clang 或 GCC 编译它时,我得到一个错误。其中最有趣的部分是:
我使用 clang 3.1 或 gcc 4.7 和 boost 1.52,但我认为没关系。:)
我应该如何编辑这段代码以使其被编译?
更新
好吧,我刚刚注意到我指定的语法是左递归的,因此递归下降解析器在处理输入时可能不会停止。这可能是编译问题的原因吗?
c++ - 将数据添加到 boost property_tree
我有一个存储在 XML 中的简单树结构,boost::property_tree::ptree
用于读取和提取信息。然后我使用重新创建树,std::maps
以便我可以将数据存储在叶子中。这很好用,我喜欢固定树结构与数据的分离,但我觉得我重复了很多代码,如果我可以为 ptree 中的每个叶节点添加一个类,我可以大大简化我的代码。
作为我boost::variant
在课堂上使用的一个可能的轻微并发症,我希望将其存储在叶子中。
我的主要问题是我是否应该尝试将动态数据添加到 ptree,其次,如果是这样,您对添加它的最佳方式有什么建议吗?
c++ - 如何在不相关的类型上实现动态多态性(运行时调用调度)?
目标:
我想在不相关的类型上实现类型安全的动态多态性(即函数调用的运行时分派)- 即在没有公共基类的类型上。在我看来,这是可以实现的,或者至少在理论上是合理的。我将尝试更正式地定义我的问题。
问题定义:
鉴于以下情况:
- 两个或多个不相关的类型
A1, ..., An
,每个类型都有一个名为 的方法f
,可能具有不同的签名,但具有相同的返回类型R
;和 - 一个
boost::variant<A1*, ..., An*>
对象v
(或任何其他类型的变体),它可以而且必须在任何时候假设任何这些类型的一个值;
我的目标是编写在概念上等同于v.f(arg_1, ..., arg_m);
将在运行时调度以运行的指令,Ai::f
如果其中包含的值的实际类型v
是Ai
. 如果调用参数与每个函数的形式参数不兼容Ai
,编译器应该引发错误。
当然我不需要拘泥于语法v.f(arg_1, ..., arg_m)
:例如,类似的东西call(v, f, ...)
也是可以接受的。
我试图在 C++ 中实现这一点,但到目前为止我还没有想出一个好的解决方案(我确实有很多不好的解决方案)。下面我澄清一下我所说的“好的解决方案”是什么意思。
约束:
一个好的解决方案是任何让我模仿v.f(...)
成语的东西,例如call_on_variant(v, f, ...);
,并满足以下约束:
- 不需要为必须以这种方式调用的每个函数(例如)或任何可以在代码中的其他地方以多态方式处理的不相关类型列表(例如)进行任何类型的单独声明,尤其是在全局范围内;
f
ENABLE_CALL_ON_VARIANT(f)
A1, ..., An
ENABLE_VARIANT_CALL(A1, ..., An)
- 调用时不需要显式命名输入参数的类型(例如
call_on_variant<int, double, string>(v, f, ...)
)。命名返回类型是可以的,所以例如call_on_variant<void>(v, f, ...)
是可以接受的。
遵循一个示范性的例子,希望能阐明我的愿望和要求。
例子:
这个程序的输出应该是:ABC
.
最佳(失败)尝试:
我最接近所需解决方案的是这个宏:
如果本地类中只允许模板成员(请参阅此问题),这将完美地工作。有没有人知道如何解决这个问题,或者提出一种替代方法?