问题标签 [boost-phoenix]
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::spirit 语义动作:发出结果
我正在尝试学习 boost::spirit 来解析语法,但我无法准确理解如何使用该库。
基本上,如果解析器在输入流中命中“测试”,我想发出 5 作为返回值。(稍后,我实际上想发出一对,带有一个字符串成员“Test”和一个值成员 5。
这是我到目前为止所拥有的:
在 main() 中:
但是,我做错了,因为编译器发出以下错误:
我的问题是为什么我不能分配给 _val?我应该如何从语义动作中发出这样的结构?
编辑 也许我应该澄清最终目标。我想将文本文件解析为成对的 Token/Literal 值。
预先感谢您的帮助!
c++ - 提神气 on_error 通过引用传递error_handler struct
我还有一个灵气的阻碍问题。
我在一个名为 error_handler 的仿函数结构中实现了错误处理。这通过引用传递给语法构造函数(参见 Qi 的 MiniC 示例)。
然后我on_error<fail>
在语法的构造函数中定义了 s:
但是,我的error_handler
有私人成员。似乎每次on_error
调用,err_handler
对象都会被复制,因此一旦仿函数离开,改变的局部变量就会被破坏。
我尝试通过引用传递处理程序:
但是,问题仍然存在:on_error()
适用于 的副本err_handler
,而不是单个实例!
我也尝试过boost::phoenix::ref(err_handler)
只有编译错误的变体。
当然,必须有一个简单的解决方案来通过引用传递处理程序?
我会很感激任何意见。谢谢您的帮助。
c++ - 如何将命名函数发送到 boost::phoenix 表达式
我不知道如何将命名函数作为参数发送给另一个函数,并将该参数包含在 phoenix lambda 表达式中。
这是我能想到的最小示例。
我不知道如何将is_odd()
函数foo()
作为谓词发送。
注意:
在我的实际代码中,谓词实际上是arg1
( arg1
is of的成员函数class Bar
,我需要Bar::is_odd
作为谓词)。我尝试过这种(arg1->*&Bar::is_odd)()
风格,但没有奏效。为了简单起见,我没有在这个例子中包括这个。
更新: 这是相同代码的 C++11 版本。这个效果很好,但是,我想让它与 phoenix 一起使用,因为我不能使用 C++11
c++ - 从语义动作更新合成属性值
我想了解 boost::spirit::qi 的幕后究竟发生了什么。假设我们有一个简单的解析器来解析和计算由数字和加/减运算组成的表达式:
qi::_val
行中的语义动作如何出现(1)
,(2)
并(3)
引用相同的值?如何在不使用 boost::phoenix 的情况下获得相同的结果?
我想我必须编写一堆从 接收解析值的函子qi::double_
,但我该怎么处理它呢?如何访问解析器的综合值?
c++ - 融合矢量投影
我有一个融合向量,其中包含多个不同类型的成员数据的元素,我想创建一个新的融合向量,它将仅投影特定的数据成员。我已经研究了一段时间,但没有进展。
c++ - 使用 boost::bind 将回调发布到任务队列
假设我有一个subscribe()
调用函数,它接受一个回调处理程序,当事件被触发时将调用它。
现在,我有另一个版本,称为subscribe2()
. 一切都是一样的,只是在触发时,它需要将其发布到事件队列中。它是使用原始实现的subscribe()
,带有一个名为 的辅助函数helper()
。它所做的只是将原始处理程序和任何其他参数绑定到仿函数中,然后调用postToEventQueue()
.
现在,我想知道有没有办法消除辅助函数,这样subsribe2()
我就可以以某种方式直接将函数和原始回调处理程序打包,postToTaskQueue()
并将其传递给 subscribe()
原因是我有很多不同的处理程序类型,到处引入辅助函数很乏味和累人。毕竟, boost::bind 应该在给定原始函数的情况下返回一个新函数,对吗?我正在尝试使用 boost::bind 直接生成辅助函数。
一种尝试是说
在subscribe2()
,但它不起作用。有可能吗?
请参阅下面的详细示例代码。谢谢!
c++ - BOOST_PHOENIX_ADAPT_FUNCTION(...) 在模板化容器上具有模板化函数
我需要 std::pair.first 的惰性评估版本。我的方法是使用 boost::phoenix,定义一个模板函数并使用 BOOST_PHOENIX_ADAPT_FUNCTION makro,如下所示:
这对于我当前程序中需要的特定情况很好(在我的情况下 T1 = std::string)。但是如何使用 first_impl 函数模板的结果类型 T1 来进一步抽象它以供将来使用?文档提到了使用typename remove_reference<A0>::type
作为 makro 的第一个参数来将函数的返回类型定义为其第一个参数的类型。基于此,我尝试了几个版本,例如:
试图访问std::pair<T1, T2>::first_type
这似乎对我不起作用。
另外,我尝试调整std::remove_reference
处理此问题的方法,如下所示
但这似乎也不起作用。有人可以指出我在这里做错了什么吗?
c++ - boost::phoenix 中的逗号行为似乎不正确
给定一个凤凰代码 [a(),b()],我认为正确的行为分别称为 a() 然后 b(),但显然在 boost 1.47 中只调用了第二个函数,这应该是什么?看下面的代码:
为什么不调用第一部分?它是最新的 boost 库中的错误和修复吗?
c++ - Boost phoenix 值和函数返回值类型
我对 Boost::Phoenix 非常陌生,我正在使用它在 C++ 中执行 FP。我浏览了他们官方页面上的教程。但是,我想知道为什么没有示例显示如何“保存”变量。例如,在值示例中,它说使用函数变量
它直接打印出执行结果。如果我想保存变量怎么办?喜欢
是什么类型的val(3)
?当我想声明一个惰性函数返回的函数变量的类型时,也会发生同样的事情。它的类型是什么?我不明白为什么整个教程总是立即输出。我用错了吗?
谢谢,易
c++ - 如何创建 boost phoenix make_shared?
是否可以创建 boost phoenix 惰性变体std::make_shared
?我的意思是,使之成为可能
一个不能使用BOOST_PHOENIX_ADAPT_FUNCTION
,因为std::make_shared
. 因此,如果可以编写一个,包装器可能应该是可变参数模板本身。