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

c++ - 提升::精神::气。如何将内联解析器表达式变成独立的语法,以及如何解包它们生成的元组?

我正在使用 QI 和 Phoenix,我想编写一个返回 4 个布尔值的小语法,这些布尔值将用作语义操作中函数调用的参数。

我有几个需要这些东西的功能,到目前为止我已经使用了这种方法:

虽然它本身没问题,但在整个地方使用它只是丑陋和令人困惑,即使“使用”命名空间部分也是如此。

这就是为什么我想把这个表达式提取成一个独立的语法。

所以我尝试了这个(归功于 ildjarn 的测试平台):

除非fourBools[phx::bind(&noDice, spirit::_1)]fourBools[phx::bind(&worksFine, spirit::_1)].

这意味着,我的问题是解包参数以匹配要调用的函数的签名,因为参数的数量在签名级别不同(四个布尔值的一个元组,而不是四个布尔值)。

是否可以直接使用 phoenix 占位符进行解包,而不是编写将元组转换为需要将它们分开的现有函数的单独参数的包装器?如果是,那将是什么语法?毕竟,当被占位符( qi::_bool >> qi::_bool >> qi::_bool >> qi::_bool)“解包”时,像这样的内联版本可以正常工作。spirit::_1 - spirit::_4,

这让我觉得这个版本好像也返回一个元组,并且在某种程度上无法使用上述方法解包,这与返回一个的语法不同。

我该如何处理?

0 投票
2 回答
2786 浏览

boost - boost phoenix什么时候有用?

可能重复:
使用 Boost.Phoenix 有什么好处?

所以我开始阅读 boost phoenix 的文档。

但是,我必须承认我不太了解该库的用途,特别是因为我们在 C++0x 中支持 lambdas。

有人可以解释一下或举个例子吗?

0 投票
2 回答
638 浏览

c++ - c++ 函数式编程 ( boost::phoenix && boost::spirit) 测试指针占位符中的空指针

所以,我有以下精神业力规则体:

这导致来自 g++ 的相当长的错误消息(有帮助)以:

这是有效的 C++:

我想尝试boost::phoenix::static_cast_<_r1_type *>(0)转换_r1_type为整数(是的,这是错误的,这只是一个实验)。

问题:

当点为零时,如何使用精神 eps 构造对占位符执行指针测试以防止规则体评估?

与所有“C++ 函数式编程库使用”问题一样,我希望答案让我感觉自己像个傻瓜。

答案

Ildjam 的观点直接回答了我的问题。我的问题有两个问题;上面有个间接问题。这与 PEG 中的条件有关。我想表达的应该这样写:

我使用语义动作主体(在 [] 块中指定)来表达语法的条件部分。奇怪的是,虽然我之前写过条件 PEG 语法,但我只是犯了一个错误,导致了第二类问题。

因此, eps(_r1) 可以解决问题,第二种类型的编译问题与问题无关。

0 投票
2 回答
677 浏览

c++ - 使用 Boost.Phoenix 的运算符 ->*

我正在玩 Phoenix v3,试图弄清楚我们是否应该对其进行标准化,而不是当前的 Bind 和 Lambda 组合。从文档中我得到的印象是应该可以简化一些表达式。

目前,我坚持将 ->* 运算符与 STL 算法结合使用。以下将编译(Visual Studio 2008 SP1),但不会给出预期的输出:

运行此示例将打印两次“A”,两次都是基于绑定的循环。所以这是我的问题:

  • 为了让基于运算符的循环真正调用 A::f,我应该更改什么?
  • 如何使用运算符更改双绑定循环?
  • 任何人都知道为什么在这些情况下不指定 mem_fn 时 VS2008 总是抱怨?我总是收到警告 C4180(应用于函数类型的限定符没有意义;被忽略)。

提前感谢您的任何见解。

0 投票
2 回答
579 浏览

c++ - 用 boost::phoenix 演员替换一元函子

我有一个 Visual Studio 2008 C++ 应用程序,我想用 boost::phoenix lambda 表达式替换一元仿函数。

就我而言,我有包含字符串的对象列表。我想删除与指定字符串不匹配的所有对象。所以,我使用这样的算法:

这工作正常。但是,我想稍微清理一下我的代码并摆脱NotMatchType仿函数,并用一个简单的 lambda 表达式替换它,如下所示:

显然,这是行不通的。

我也试过:( arg1->*&Foo::my_type ).compare( some_type ) != 0

我需要做什么才能使 boost:phoenix:actor 看起来像一个Foo对象?

0 投票
1 回答
3309 浏览

c++ - 如何使用一些 boost 库使 std::find_if 和 std::map 一起工作?

这个问题的灵感来自另一个提出这个问题的话题:

从地图容器中查找大于用户指定值的第一个值

这可以通过多种方式解决。典型的 C++03 解决方案定义了一个专用函数(或函子)并将其std::find_if作为第三个参数传递。

在 C++11 中,可以避免定义专用函数(或仿函数),而是可以使用lambda如下:

这是公认的答案

我仍在寻找一个简短而酷的解决方案。如果它是一个向量,那么我刚刚学习了一个很酷的解决方案,它利用Boost.Phoenix并且解决方案变得非常简洁(ideone demo):

arg1是在boost::phoenix::arg_names命名空间中定义的仿函数对象,表达式arg1>4计算为另一个仿函数,然后传递给std::find_if.

快速测试是(ideone),


我的问题是,我想以类似的方式解决地图问题。有没有这样的解决方案?就像是:

或者,

为了使它起作用,表达式at<1>(arg1) > 2必须计算为一个以const std::pair &作为参数的函子。我的直觉告诉我 boost 有这个解决方案。:-)

0 投票
2 回答
683 浏览

c++ - phoenix lambda 和参数取消引用

有人可以告诉我如何使用 boost::phoenix lambda 实现以下等效项吗?我知道我可以通过许多其他方式实现它,但我正在尝试学习 Phoenix lambda 表达式,到目前为止,我在这个示例中的所有尝试都失败了。

我想要做的是使用 std::remove_if 遍历我的一组 weak_ptrs 并删除过期的。

所以代码看起来像:

我发现的大多数 lambda 示例都非常简单,并且不涉及在 lambda 参数对象上调用成员函数,尤其是在存在多个间接级别时。即 _1 应该代表集合的迭代器,它通过用“->”取消引用返回 value_type(是weak_ptr),我想在其上调用过期。但是由于 _1 实际上不是直接的迭代器而是“phoenix::actor”,所以我的取消引用不会编译。

提前感谢所有创意投入。

加布

0 投票
1 回答
503 浏览

c++ - Boost phoenix actor as a fusion callable object

I was wondering if it was possible to create callable phoenix actors and use them in fusion sequences. Given the following source:

This works as expected.
But since I can create polymorphic callable actors in phoenix like this:

I was wondering if I can use phoenix to get rid of my FusionCaller struct. Like this: fusion::for_each(fmap, /* some magic phoenix expression*/);

So is this possible at all with phoenix?

0 投票
1 回答
109 浏览

c++ - boost::phoenix 与 VS2008

使用 boost::phoenix 的简单示例:

它可以编译,但在 VS2008 的输出中有一些警告:

c:\boost_1_47_0\boost\phoenix\bind\detail\member_variable.hpp(54) : 警告 C4180:应用于函数类型的限定符没有意义;忽略

它来自哪里:1)代码不正确2)再次出现MS问题。3) boost::phoenix 库做得不好?

0 投票
1 回答
175 浏览

c++ - 在堆上生成对象的函数式编程技术

有在堆上生成 N 类 A 对象的代码示例:

代码使用仿函数“Generator”和“generate_n”算法来完成这项工作。我很想简化这项任务。boost:lambda, boost::phoenix 是可能的候选者(如果是的话?),怎么做?或者也许还有其他选择?