问题标签 [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.
c++ - 将 Boost.Proto 语法与类型匹配
我试图在 Boost.Proto 中创建一个匹配向量类型的语法,但是当我给它一个该类型的终端时,它与语法不匹配。类型定义如下所示:
我试图匹配的语法看起来像这样:
匹配失败:
如何制作与特定类型匹配的语法?
编辑:
似乎 proto::_ 和 proto::N 没有在自定义类型中用作通配符。该代码确实使用此语法编译(matches
断言通过):
但是当任一通配符属于以下类型时不起作用:
或者:
因此,如果我不能使用我自己的类型的通配符,我如何测试表达式是否是包含向量的终端?
c++ - 如何确定编译器对元程序的作用?(对于 boost.proto)
如何确定我的编译器 (g++) 对模板代码做了什么?
我正在使用 boost.proto(一个表达式模板库)在编译时评估一些数学表达式。代码正确评估表达式,但我想看看编译器是否已将表达式扩展为相当于手写 c 代码(即消除了所有临时代码),或者是否还有一些进一步的编译时优化要完成。
有没有办法查看编译器对模板做了什么?
谢谢
c++ - 如何使 boost-proto 函数表达式可流化?
我正在阅读 boost-proto 教程,并在惰性 pow 函数示例中遇到了这个问题。这是示例代码:
现在,如果我尝试
编译器抱怨它没有 operator<< 用于函数表达式。我如何定义一个?
谢谢。
编译器错误是:
display_expr::first_ ? ((const char*)"") : ((const char*)", "))))), boost::proto::tag::proto_tag_name((boost::proto::tag::terminal(), boost::proto::tag::terminal())))), ((const char*)"(")) << boost::proto::value [with Expr = boost::proto::exprns_: :expr >, 0l>](((const boost::proto::exprns_::expr >, 0l>&)((const boost::proto::exprns_::expr >, 0l>*)expr))) '</p>
c++ - 如何确定 eval 在 proto 表达式上返回的类型?
我为我的语法定义了一个上下文,它以输入类型为模板,类似于下面的代码片段。我错过了 ???? 是。
在我开始编写递归模板来弄清楚它们之前,proto 中已经有什么了吗?
c++ - 我可以知道转换中匹配 boost::proto::_ 的类型吗?
在 boost::proto 手册中,有一个匹配 std::transform<...> 类型终端的语法示例:
我想编写一个转换来处理 proto::_ 的类型。例如,当匹配一个 proto::terminal< std::complex< T > > 时,它返回一个 boost::shared_ptr < T > 。
这可能吗?
陈述我的问题的另一种方式是,如何使以下代码段起作用?
c++ - 如何编写由函数模板化的原型转换?
我想通过编写一个由函数指针模板化的原型转换来重用代码:
但是,函数本身是多态的,所以我不想指定它的确切签名。
我希望我的代码如下所示的简化版本(出于技术原因,我使用外部转换,我认为这与我当前的问题无关 - 没有它们我无法使递归工作):
这不会编译,因为 appy_func 模板缺少参数。有解决办法吗?
c++ - 使用 boost::proto 构建 s 表达式
我正在尝试使用boost::proto
以下终端构建 s-expression 对象:
并像这样使用它:
但是,这对我来说并不编译;
我做错了什么?任何建议如何使用 s 表达式获得类似或等效的东西boost::proto
?
c++ - boost.lambda 或 boost.phoenix 的静态函数
我经常使用 boost.lambda(和 phoenix)在 C++ 中定义 lambda 函数。我真的很喜欢它们的多态属性、它们的简单表示以及它们使 C++ 中的函数式编程变得如此容易的方式。在某些情况下,使用它们来定义小函数并在静态范围内命名它们会更干净、更易读(如果您习惯阅读它们)。
存储这些与传统函数最相似的函数的方法是将它们捕获在一个boost::function
但问题是这样做的运行时效率低下。尽管add
这里的函数是无状态的,但返回的 lambda 类型不是空的,并且sizeof
大于 1(因此boost::function
默认 ctor 和复制 ctor 都会涉及new
)。我真的怀疑编译器或 boost 方面是否有一种机制来检测这种无状态并生成相当于使用的代码:
当然可以使用 c++11 auto
,但是变量不能在非模板上下文中传递。使用以下方法,我终于设法做几乎我想做的事:
使用 gcc 4.6.1 编译该程序的输出是(无论优化级别如何):
正如预期的那样。在这里,我保留了一个指向 lambda 表达式类型的静态指针(出于优化目的,尽可能为 const)并将其初始化为NULL
. 这样,如果您尝试“静态化”带有状态的 lambda 表达式,您肯定会遇到运行时错误。如果你静态化一个真正无状态的 lambda 表达式,一切都会解决。
关于问题:
该方法似乎有点脏,您能想到任何会导致这种行为不端的情况或编译器假设(预期行为:如果 lambda 是无状态的,则可以正常工作,否则会出现段错误)。
当 lambda 表达式有状态时,你能想到任何尝试这样做会导致编译器错误而不是段错误的方法吗?
在 Eric Niebler 回答后编辑:
c++ - 非默认构造的 boost::proto 终端
我正在尝试使用 boost::proto 定义一个非常有限的解析器组合库,并且想知道是否可以通过任何方式定义一个非默认构造的 proto 终端。
我有这样的结构:
我想在 proto 表达式中用作 boost proto 终端。我能够在 的帮助下让它工作BOOST_PROTO_DEFINE_OPERATORS
,但我发现经常必须将它包装在proto::lit()
内部 proto 表达式中有点不方便:
我想知道我是否可以像这样创建一个原型终端:
这将能够以某种方式获取一个字符串参数并将其传递给符号的构造函数。
注意:我知道 Spirit,但我的编译器不太支持它!
c++ - boost.proto + 在构建表达式树之前检测无效终端
我在玩 Boost.Proto,主要是为了好玩,看看将来我是否可以在我自己的项目中使用它。也就是说,可能作为这个库的大多数初学者,我玩过“惰性向量”示例的修改版本,但使用转换而不是上下文来执行评估。向量定义如下(好吧,我知道,“向量”对于在全局命名空间范围内定义的东西不是一个好名字......)
它以维度和数据类型为模板,类似于 boost::array (我没有使用它,因为我想重载 operator= 以接受表达式树,就像在这类事情中通常所做的那样)。我使用 proto 手册中的代码定义了标量
现在,我想做的第一件事是:检查表达式中的所有向量终端是否具有相同的维度 D。我最终得到了以下工作代码
问题是:由于数组的维度已经编码在表达式中,那么应该可以在编译时检测到无效组合。甚至应该可以避免一开始就创建树。这是如何实现的?
在此先感谢,最好的问候