问题标签 [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 回答
135 浏览

c++ - 如何用通用 TR1 函数对象包装多个函数重载?

我有一个foo()在库上下文中提供的函数。该库为此函数定义了一些重载,例如:

(我把上面的参数/结果类型做了起来。外卖是参数类型和重载的相应返回类型之间没有通用关系。)

这个想法是库用户可以foo()根据需要为他们自己的用户定义类型添加重载。函数重载很容易做到这一点。

我想让foo()函数族在Boost.Proto表达式中可用。为了做到这一点,我想我需要将上面的内容包装在一个带有模板调用运算符的函数对象中:

问题在于如何定义result_type. 我意识到使用 C++11 和尾随函数返回类型会很容易decltype(),但我正在寻找 C++03 解决方案。因此,foo_wrap需要是一个TR1风格的函数对象。我需要找到一种方法来定义result_type参数类型A1A2. 这不仅需要 的返回类型operator(),而且 TR1result_of协议也需要。简而言之:

  • 有没有一种元编程技术,给定一个函数名和一组参数类型,将产生函数对应的返回类型?
  • 或者,是否有另一种技术可以用来用通用函数对象包装函数的多个重载?
0 投票
2 回答
917 浏览

c++ - Boost.Proto:如何制作原始数组的表达式终端而不是 std::vector?

现在我正在尝试为向量表达式制作另一种迷你 EDSL(嵌入式领域特定语言)。实际上 Boost.Proto 用户指南已经提供了这样一个 EDSL 示例,“惰性向量”,其中向量表达式由std::vector<T>. 但我必须改为使用原始数组的那些表达式。因为原始数组操作仍然是几个科学模拟程序的核心。

ArrayWrapper因此,我在“惰性向量”代码中添加了一个数组包装类,并替换std::vectorArrayWrapper. 此修改后的源代码已成功编译和链接。但是当我运行它时,核心被转储了。

这是源代码的修改版本:

我想我的数组包装类具有“惰性向量”程序的其余部分所需的所有必要成员函数。而且我认为这些成员函数的接口与std::vector原始“惰性向量”程序使用的成员函数的接口相同。

可能我错过了一些重要的观点。但是如何解决这个问题?(我应该如何proto::terminal<T>使用原始数组制作对象?)如果您能给我建议或提示,我将不胜感激。

0 投票
1 回答
46 浏览

c++ - 如何将父引用添加到 Boost.Proto 表达式?

我想生成具有从子到父的“反向”引用的表达式树。有没有办法自定义 Proto 生成器或域,以便表达式包装器类(使用proto::extends<>)包含对父表达式的引用?

这背后的目标是创建缓存评估结果的表达式树,以便可以有效地重新评估它们。我的策略是更新终端值,然后沿着树将父节点标记为“脏”,以便在评估根表达式时重新评估它们。

0 投票
1 回答
3738 浏览

c++ - 使用 boost::proto 在 C++ 中编写 DSL

很抱歉提出这样一个开放式问题,但我想在 C++ 中模拟一些合成程序集(不是用于真正的处理器),并且我想将程序集与其运行的模拟器的实现分离。

编写 DSL 或类似的方法似乎是显而易见的方法,我对此有一些经验,在 Groovy 中做过类似的事情(实际上是 DSL 和解释器的混合体)。

boost::proto 似乎是显而易见的选择,但我发现文档完全无法理解,尽管正如我所说,我掌握了一些基础知识。

是否有任何替代教程或类似教程可以解释 - 以侧重于编写 DSL 的实用性而不是 AST 理论等的方式 - 如何做到这一点。还是有替代方案?现在,我坚持将汇编指令实现为构成模拟器的类的方法,这使得它们的绑定非常紧密,并且极难维护代码库。

0 投票
1 回答
218 浏览

c++ - Boost.Proto:Proto 转换是否可以评估矩阵和向量的混合表达式?

现在我正在尝试教 g++ 编译器线性代数,以便 g++ 可以重写表达式,例如(matrix * vector)(index)用于评估表达式的循环。基本上,这就是我所期望的作为“富有表现力的 C++ ”系列最后一篇文章的下一篇文章。上一篇文章解释了如何制作用于添加向量的 EDSL,因此我编写了另一个用于将矩阵乘以向量的 EDSL。

但是当我自己的矩阵和向量类的 Proto 域的名称作为第一个宏参数传递时,无法编译 BOOST_PROTO_DEFINE_OPERATORS 宏。

所以我想知道 Proto 转换是否有可能评估矩阵和向量对象的混合表达式。似乎没有可以编译的示例代码,Proto 用户指南 1.57.0中“将现有类型适配到 Proto”中的示例代码虽然是关于如何将现有矩阵和向量类型适配到 Proto,但并不完整。

我很茫然..你能给我一些建议或提示吗?

这是我的源代码。如果您能建议我如何解决它,我将不胜感激:

0 投票
1 回答
177 浏览

c++ - boost::proto::is_aggregate 当它是一个聚合类型时返回 false

在测试聚合类型时,我尝试使用 boost::proto::is_aggregate 来检查我创建的类型是否真正聚合。我写了这段代码:

而且我希望输出为真,因为聚合类型可以定义复制分配运算符(据此:什么是聚合和 POD 以及它们如何/为什么特别?

但是输出是假的。

我还在上一个答案中使用了聚合类,它应该返回 true,但返回 false。

这是在 Boost 1.5.9 上使用英特尔编译器和 MSVC 进行测试的。

关于为什么会发生这种情况的任何想法?

0 投票
0 回答
62 浏览

c++ - 在 Boost.proto 中使用派生类作为终端

假设您想使用 Boost.proto 实现一个简单的 EDSL(嵌入式域特定语言),并满足以下要求:

  • 自定义类“矢量”作为终端
  • 从 'Vector' 派生的类也是工作终端,例如 Vector10

阅读 Boost.proto 的手册,似乎与此最相关的示例是“向量:调整非原型终端类型”示例。

我对该示例所做的修改:

  • 添加了“矢量”类
  • 原型向量而不是 std::vector

这里的代码(编译):

已经Vector10定义了派生类。现在 - 使用那个而不是 Vector

导致编译错误

我相信 Vector 的运算符已在命名空间 VectorOps 中正确定义,但 ADL 不会为派生类启动。

0 投票
1 回答
67 浏览

boost-proto - Proto 表达式中某处的匹配运算符

为什么以下Boost.Proto语法不匹配取消引用运算符,正确的方法是什么?

0 投票
1 回答
47 浏览

boost - 非原型对象作为终端

我想出于所有目的使用非原型类的实例作为原型终端。为了启用此功能,我使用is_terminal 元函数并将其传递给BOOST_PROTO_DEFINE_OPERATORS().

这实际上定义了运算符,因此以下表达式按预期生成了一个表达式树:

但是,我不能这样做:

而相反的编译:

看来我的对象不能转换为 proto 表达式。这个问题有什么解决方法吗?

关于科利鲁

0 投票
0 回答
99 浏览

c++ - 可以 Boost Proto 使结构适应 getter setter 类型的 API

这似乎是一个普遍的问题。我有两组需要粘合在一起的大量代码:一组使用简单的结构来保存数据,另一组具有仅公开 getter/setter 方法的 API。

是否可以使用 Boost.Proto 定义一个映射,然后可以用来自动生成调用 getter/setter 的代码?从概念上讲,似乎最困难的部分是要调用的函数名称的合成,因为这将涉及编译时字符串连接。其他挑战包括将枚举类型从一种映射到另一种以及自定义初始化或转换代码。

拥有一个基于 Proto 的就地解决方案可以解决这个问题,这对各种各样的人来说都是一个巨大的好处。

例如,我有一个 API 类型如下:

虽然我在简单的直接访问结构中也有数百万行具有相同数据的代码:

现在老掉牙的办法是加很多转换器:

但是,以 Boost.Spirit 的风格,我想使用 Proto 创建一个 EDSL,允许我指定映射,并让编译器为我生成重复代码。

我可以定义足够多的 Proto 终端来编译这个构造函数:

转换在概念上可以是一个简单的函数调用:

这是一个丑陋的开始,但我现在对如何破坏名称以生成对 getter 和 setter 的调用感到困惑。

这可能吗?解决方案会是什么样子?