问题标签 [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::phoenix::function 的问题
使用boost::phoenix::function我遇到了一些问题。据我所知,这个惰性函数需要仿函数作为它的模板参数。我必须定义一个仿函数类/结构,然后将其作为模板参数传递以进行实例化。但它太长而且多余。我可以使用其他一些可调用类型进行phoenix::function
创建(函数引用/指针等)吗?我试过lambdas
:
但调用lazy()
没有编译。那么问题是有没有替代函子类来快速创建单行phoenix::function
代码?
c++ - 使用 boost::phoenix 适配一个 BOOST_CHECK 宏
在使用 c++ 11 进行测试期间,我使用了以下构造:
我目前正在研究一个不使用 C++11 的项目,我是否正在寻找一种方法来生成类似的 lambda 表达式,而不必创建单独的函数/仿函数。
我了解boost::phoenix
创建 lambda 的基本用法,但我想不出一种方法来创建能够调用boost::test
宏的 phoenix lambda。
我能想到的最好的是:
不幸的是,这种方法会丢失检查失败的行号信息,因为宏 BOOST_CHECK_EQUAL 报告的是宏的行号,而不是std::for_each
调用的行号。
有没有更好的方法来创建涉及使用“boost::phoenix”的宏调用的 lambda?
c++ - 使用 boost::phoenix::bind 和 boost::spirit::qi::symbols::add
我想解析文本文件中的浮点数并将其插入符号表中;解析器和符号表由 Spirit::qi 提供。
这是我的代码:
这里的问题在于 boost::phoenix::bind,但我不知道如何解决这个问题(我对这个库相当陌生)。
c++ - 我可以在编译时判断 Boost.Phoenix lambda 的一组特定输入类型是否有效?
假设我有一个 Boost.Phoenix lambda 表达式,如下所示:
有没有一种好方法可以在编译时检测 lambda 表达式是否有效,给定与 arguments 相关的类型列表_1
,_2
等等?我在想我想用它enable_if
来确定 lambda 是否支持输入类型。如果是这样,将直接调用 lambda,而如果不是,我想生成一个无操作。伪代码将是这样的:
我只是不确定如何is_supported
实施,或者是否有可能。我没有使用 C++11;我会假设只有 C++03(因为 Phoenix 需要它)。
c++ - Boost Phoenix 运算符重载/重新定义?
有没有(最好是简单的)方法来重新定义 Phoenix 中的标准运算符之一?我想有“>>”例如调用我自己的(懒惰的)仿函数。
简单用例:我可能想定义一个“管道”运算符,以便:
可以用一种非常棘手的方式写成
然后调用为
c++ - boost::phoenix::insert 的评估结果
我在尝试评估boost::phoenix::insert
将元素插入地图的结果时遇到了困难。与常规std::map::insert
返回的actor对象类似,它boost::phoenix::insert
也返回一个std::pair<Iterator where, bool result>
. 我对该对的第二个元素感兴趣,以检查插入是否成功。说明该问题的大量条带化代码示例如下:
使用 MSVC2012 和 boost 1.53 时出现以下错误:
clang3.2报同样的错误:
我即将用完如何正确评估插入结果的想法。任何帮助,将不胜感激。
编辑:我的问题的更广泛背景是我正在尝试使用 boost::spirit::qi 解析类似 C++ 的枚举。我发现的任何尝试实现相同目的的示例都不会检查重复的枚举成员。这里有两个相关规则的代码片段:
c++ - 在 boost::phoenix::lambda 中通过引用捕获
我可以创建一个boost::phoenix::lambda
按价值捕获的产品。但是,尝试修改由 value 捕获的变量会产生以下错误
有道理,然后通过引用捕获。通过引用捕获会在 clang 3.2 中产生以下错误:
在下面的示例中,我需要通过引用来捕获以获取与 C++11 lambda 等效的代码。通过引用捕获的正确方法是boost::phoenix::lambda
什么?
最小的例子:
更新 1:已删除using namespace std;
(Xeo 在评论中建议)。
c++ - boost::spirit:语义动作块中的多个语句
boost::phoenix 使用运算符 "," 定义语句块(参见boost phoenix 块语句)。我正在尝试在 boost::spirit 规则的语义操作部分中使用此构造。但是,看起来只执行了语句块中的最后一条语句。这是一个显示问题的最小可编译示例:
该程序(使用 boost 1.52)打印
1:a=0,b=2
但我期待a = 1,b = 2。这是它应该如何工作的吗?为什么?
谢谢!