问题标签 [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.

0 投票
1 回答
638 浏览

c++ - boost::spirit 语义动作:发出结果

我正在尝试学习 boost::spirit 来解析语法,但我无法准确理解如何使用该库。

基本上,如果解析器在输入流中命中“测试”,我想发出 5 作为返回值。(稍后,我实际上想发出一对,带有一个字符串成员“Test”和一个值成员 5。

这是我到目前为止所拥有的:

在 main() 中:

但是,我做错了,因为编译器发出以下错误:

我的问题是为什么我不能分配给 _val?我应该如何从语义动作中发出这样的结构?

编辑 也许我应该澄清最终目标。我想将文本文件解析为成对的 Token/Literal 值。

预先感谢您的帮助!

0 投票
2 回答
2111 浏览

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)只有编译错误的变体。

当然,必须有一个简单的解决方案来通过引用传递处理程序?

我会很感激任何意见。谢谢您的帮助。

0 投票
1 回答
200 浏览

c++ - 如何将命名函数发送到 boost::phoenix 表达式

我不知道如何将命名函数作为参数发送给另一个函数,并将该参数包含在 phoenix lambda 表达式中。

这是我能想到的最小示例。

我不知道如何将is_odd()函数foo()作为谓词发送。

注意: 在我的实际代码中,谓词实际上是arg1( arg1is of的成员函数class Bar,我需要Bar::is_odd作为谓词)。我尝试过这种(arg1->*&Bar::is_odd)()风格,但没有奏效。为了简单起见,我没有在这个例子中包括这个。

更新: 这是相同代码的 C++11 版本。这个效果很好,但是,我想让它与 phoenix 一起使用,因为我不能使用 C++11

0 投票
1 回答
404 浏览

c++ - 从语义动作更新合成属性值

我想了解 boost::spirit::qi 的幕后究竟发生了什么。假设我们有一个简单的解析器来解析和计算由数字和加/减运算组成的表达式:

qi::_val行中的语义动作如何出现(1)(2)(3)引用相同的值?如何在不使用 boost::phoenix 的情况下获得相同的结果?

我想我必须编写一堆从 接收解析值的函子qi::double_,但我该怎么处理它呢?如何访问解析器的综合值?

0 投票
1 回答
446 浏览

c++ - 融合矢量投影

我有一个融合向量,其中包含多个不同类型的成员数据的元素,我想创建一个新的融合向量,它将仅投影特定的数据成员。我已经研究了一段时间,但没有进展。

0 投票
2 回答
1111 浏览

c++ - 使用 boost::bind 将回调发布到任务队列

假设我有一个subscribe()调用函数,它接受一个回调处理程序,当事件被触发时将调用它。

现在,我有另一个版本,称为subscribe2(). 一切都是一样的,只是在触发时,它需要将其发布到事件队列中。它是使用原始实现的subscribe(),带有一个名为 的辅助函数helper()。它所做的只是将原始处理程序和任何其他参数绑定到仿函数中,然后调用postToEventQueue().

现在,我想知道有没有办法消除辅助函数,这样subsribe2()我就可以以某种方式直接将函数和原始回调处理程序打包,postToTaskQueue()并将其传递给 subscribe()原因是我有很多不同的处理程序类型,到处引入辅助函数很乏味和累人。毕竟, boost::bind 应该在给定原始函数的情况下返回一个新函数,对吗?我正在尝试使用 boost::bind 直接生成辅助函数。

一种尝试是说

subscribe2(),但它不起作用。有可能吗?

请参阅下面的详细示例代码。谢谢!

0 投票
1 回答
167 浏览

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处理此问题的方法,如下所示

但这似乎也不起作用。有人可以指出我在这里做错了什么吗?

0 投票
1 回答
91 浏览

c++ - boost::phoenix 中的逗号行为似乎不正确

给定一个凤凰代码 [a(),b()],我认为正确的行为分别称为 a() 然后 b(),但显然在 boost 1.47 中只调用了第二个函数,这应该是什么?看下面的代码:

为什么不调用第一部分?它是最新的 boost 库中的错误和修复吗?

0 投票
1 回答
438 浏览

c++ - Boost phoenix 值和函数返回值类型

我对 Boost::Phoenix 非常陌生,我正在使用它在 C++ 中执行 FP。我浏览了他们官方页面上的教程。但是,我想知道为什么没有示例显示如何“保存”变量。例如,在值示例中,它说使用函数变量

它直接打印出执行结果。如果我想保存变量怎么办?喜欢

是什么类型的val(3)?当我想声明一个惰性函数返回的函数变量的类型时,也会发生同样的事情。它的类型是什么?我不明白为什么整个教程总是立即输出。我用错了吗?

谢谢,易

0 投票
2 回答
469 浏览

c++ - 如何创建 boost phoenix make_shared?

是否可以创建 boost phoenix 惰性变体std::make_shared?我的意思是,使之成为可能

一个不能使用BOOST_PHOENIX_ADAPT_FUNCTION,因为std::make_shared. 因此,如果可以编写一个,包装器可能应该是可变参数模板本身。