问题标签 [boost-proto]

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 回答
502 浏览

c++ - boost.proto + 就地修改表达式树

背景问题:boost.proto + 在构建表达式树之前检测无效终端

嗨,我想要实现的是

  1. 创建一个表达式树的副本,其中所有向量都用它们的开始迭代器替换(在我的例子中是一个原始指针)
  2. 就地增加迭代器
  3. 树中的取消引用迭代器,但那部分应该相对容易。

所以,对于 1. 我最终得到了这段代码

以上成功创建了一个所有向量都被指针替换的树。到现在为止还挺好。现在,尝试增加迭代器。我意识到推进迭代器会更好,因此只需一次转换,我就可以获得随机访问迭代器的大部分行为(取消引用是另一个缺失的部分)。对于 2.,所需的转换应该是

现在,在主函数中

我收到以下错误消息(过滤掉垃圾):

array.cpp:361:13:错误:分配只读位置

困扰我的是 '((* & var))' 部分......无法理解如何解决这个问题。在此先感谢,最好的问候

PS 无关的事情:在玩了一些变换之后,我使用的一般模式是:

  1. 决定对树做什么
  2. 编写一个执行操作的原始变换
  3. 编写一个识别应该在哪里应用转换的语法,使用之前定义的转换

你认为这合理吗?我的意思是,仅对一种节点执行基本操作需要大量代码。使用上下文,可以一次定义多个操作,区分节点类型。也可以通过转换来做到这一点?使用的一般模式是什么?

0 投票
1 回答
238 浏览

c++ - boost.proto + 从特定于域的表达式包装器中解包表达式

背景问题:boost.proto + 就地修改表达式树

嗨,考虑以下转换以value_type从 a中提取vector_expr(请参阅前面的问题)

上面的代码可用于为表达式树提供“最大”value_type,这是应用通常的 C++ 提升规则和 Boost.TypeOf 魔法获得的。以上使用如下

但是现在,以下代码(检查上一个问题:boost.proto + modify expression tree in place和接受的答案中的代码)被破坏了(为了我的快乐,使用通常的巨大模板实例化错误回溯)

原因很简单。的类型typename boost::result_of<vector_begin_algo(a+b)>::type是:

因此,外部vector_expr<...>触发了嵌套的评估value_type,但deduce_value_type算法不知道如何从中提取value_type嵌套vector_iterator<double*>。一种解决方案是定义一个新的特征并修改deduce_value_type如下

这种方法有几个问题,但最重要的是:对于我发现在vector_expr结构中方便定义的每个 typedef 或静态常量,我需要执行上述所有操作才能编译表达式,即使是迭代器表达式IS-NOT 向量表达式,扩大 vector_expr 的接口以适应转换后的树是没有意义的。

问题是:有一种方法可以转换vector_expr树,将向量节点转换为迭代器节点,同时从树本身中移除向量,这样我就不会遇到上述问题?预先感谢,最好的问候!

更新 抱歉,我现在更改了问题的最后一部分,因为我更清楚(我认为)应该实现什么。同时,我尝试自己解决问题并取得了部分成功(?),但我觉得应该有更好的方法(所以我仍然需要帮助!)。

在我看来,问题来自于将所有树节点都包裹在vector_expr事物中,这具有对终端提出要求的副作用(主要是成功编译的静态内容)。OTOH,一旦vector_exp构造了有效的(即:遵守vector_grammar),那么我可以将其转换为有效的 iterator_tree 而无需进一步检查。

我试图创建一个转换,vector_expr将树中的所有节点都改回“proto::expr”。代码如下:

0 投票
1 回答
372 浏览

c++ - Boost.Proto and Complex Transform

I'm experimenting with Proto to build a DSEL that operates on geometric vectors. I'm trying to write a transform that would take an assign expression and unroll it component wise. For instance, I want to replace

by

So far I have been able to mostly make it work by making a transform template unroll_vector_expr that recursively unrolls the expression for each vector component, in conjunction with a distribute_subscript transform.

I don't seem to understand whats the rationale for the 'parameters' used with boost::result_of and result_of::make_expr. The documentation, examples and internal code seem to mix Expr, impl::expr and impl::expr_param. I'm not sure what should I be using and when so that the result_type matches the actual result type. Currently I made it work by trial an error, by examining the error messages and fixing the const and & discrepancies. However, as soon as I deep copy the expression the terminals are no longer hold by reference and my code fails.

How should I write my transform so that the result_type matches the result from operator (), and works for terminals both hold by value and by reference?

Update: Code updated after Eric's answer. The only remaining mismatch between result_type and make_expr is for the first instantiation of unroll_vector_expr_c, where the terminal< mpl::size_t< 0 > >::type is held by const reference instead of by value. Curiously enough, subsequent instantiations of the same template with higher indices do not result in this issue.

Update: I managed to get the code to fully work, after modifying the distribue_subscript transform to force to take the subscript index by value:

0 投票
1 回答
249 浏览

c++ - 为什么这个 proto/phoenix 玩具示例会崩溃?

我正在试验 proto 和 phoenix,我的第一个玩具示例崩溃是什么,我不知道应该在哪里看。由于#boost IRC 频道上的某个人告诉我要确保首先深度复制 phoenix 表达式树(以便在构造时没有悬空引用x),因此我将表达式包装为boost::proto::deep_copy. 然而,这并不完全奏效-O2使用标志编译时它仍然崩溃,并且在省略它时工作正常

我希望这能输出hellobye

0 投票
0 回答
207 浏览

c++ - 如何在 Boost Proto/Phoenix 中使用非多态 lambda?

0 投票
0 回答
495 浏览

c++ - Boost Phoenix 中的用户定义参数

0 投票
1 回答
564 浏览

c++ - 转换 Boost C++ Phoenix 表达式树

在 Boost Phoenix 文章“转换表达式树”中,这里使用了一组自定义invert_actions类的特化,用于反转二进制算术表达式。例如a+b变成a-b; a*b变成a/b; 反之亦然。

这涉及表达式树的递归遍历 - 但是,当遇到涉及未显式处理的运算符的表达式时,此遍历​​停止。例如,_1+_2-_3将变为_1-_2+_3,但_1+_1&_2将保持原样(没有处理程序&)。let(_a = 1, _b = 2) [ _a+_b ]也将保持不变。

我原以为这与文章的意图一致,但看看最后列出的测试,我发现这种if_(_1 * _4)[_2 - _3]情况预计会发生变化;使用提供的代码(此处),我发现它没有。

那么如何定义一个通用的 Boost Phoenix 表达式树变换,它适用于所有一组显式列出的(n 元)运算符;保持其他不变?

一些代码可能有用。我希望输出以下 C++11 代码(自动)0,而不是2没有明确处理&, 或任何其他运算符/语句。

0 投票
1 回答
320 浏览

c++ - 使用 Boost Fusion 显示扁平化的 Phoenix 表达式

0 投票
1 回答
406 浏览

c++ - 在 Boost Phoenix 表达式中转换函数体

如何在 Boost Phoenix 表达式的转换中也包含函数体?

例如,我在Boost Phoenix Starter Kit的 Lazy Functions 部分构建,并创建了一个惰性添加函数:

然后,我从上一个问题准备一个简单的正负转换,如下所示:

但是,当我使用 , 对其参数应用一个倒置的 Phoenixlambda表达式时,my_add如下所示,似乎没有实现预期的倒置。有没有推荐的方法在 Phoenix 中实现函数调用,可以促进这种转换?

0 投票
1 回答
297 浏览

c++ - Boost C++ Phoenix 用户定义参数的下标运算符 [] 错误

使用现有的 Boost Phoenix(占位符)参数,例如_1,我可以使用数组/下标运算符。例如,以下摘录将显示一个1.

但是,如果我定义自己的占位符参数:

尽管它可以正常工作(以下输出为 7):

如果我尝试使用下标运算符(如上):

我收到很多错误;总之,使用 G++ 4.7.2,模板参数推导失败;使用 Clang 3.2,我被告知函数不能返回数组类型。

如何使我的 Phoenix 占位符参数支持下标运算符?