Boost C++ 库

...世界上最受尊敬和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

第 30 章。Boost.Proto

Eric Niebler

根据 Boost 软件许可协议 1.0 版本分发。(请参阅随附文件 LICENSE_1_0.txt 或访问 https://boost.ac.cn/LICENSE_1_0.txt 复制许可协议)

目录

前言
用户指南
入门
前端:定义 EDSL 的终结符和非终结符
中间形式:理解和内省表达式
后端:使表达式模板执行有用的工作
示例
背景和资源
词汇表
参考
概念
函数
头文件 <boost/proto/args.hpp>
头文件 <boost/proto/core.hpp>
头文件 <boost/proto/debug.hpp>
头文件 <boost/proto/deep_copy.hpp>
头文件 <boost/proto/domain.hpp>
头文件 <boost/proto/eval.hpp>
头文件 <boost/proto/expr.hpp>
头文件 <boost/proto/extends.hpp>
头文件 <boost/proto/functional.hpp>
头文件 <boost/proto/functional/fusion.hpp>
头文件 <boost/proto/functional/fusion/at.hpp>
头文件 <boost/proto/functional/fusion/pop_back.hpp>
头文件 <boost/proto/functional/fusion/pop_front.hpp>
头文件 <boost/proto/functional/fusion/push_back.hpp>
头文件 <boost/proto/functional/fusion/push_front.hpp>
头文件 <boost/proto/functional/fusion/reverse.hpp>
头文件 <boost/proto/functional/range/begin.hpp>
头文件 <boost/proto/functional/range/empty.hpp>
头文件 <boost/proto/functional/range/end.hpp>
头文件 <boost/proto/functional/range/rbegin.hpp>
头文件 <boost/proto/functional/range/rend.hpp>
头文件 <boost/proto/functional/range/size.hpp>
头文件 <boost/proto/functional/std.hpp>
头文件 <boost/proto/functional/std/iterator.hpp>
头文件 <boost/proto/functional/std/utility.hpp>
头文件 <boost/proto/fusion.hpp>
头文件 <boost/proto/generate.hpp>
头文件 <boost/proto/literal.hpp>
头文件 <boost/proto/make_expr.hpp>
头文件 <boost/proto/matches.hpp>
头文件 <boost/proto/operators.hpp>
头文件 <boost/proto/proto.hpp>
头文件 <boost/proto/proto_fwd.hpp>
头文件 <boost/proto/proto_typeof.hpp>
头文件 <boost/proto/repeat.hpp>
头文件 <boost/proto/tags.hpp>
头文件 <boost/proto/traits.hpp>
头文件 <boost/proto/transform.hpp>
头文件 <boost/proto/transform/arg.hpp>
头文件 <boost/proto/transform/call.hpp>
头文件 <boost/proto/transform/default.hpp>
头文件 <boost/proto/transform/env.hpp>
头文件 <boost/proto/transform/fold.hpp>
头文件 <boost/proto/transform/fold_tree.hpp>
头文件 <boost/proto/transform/impl.hpp>
头文件 <boost/proto/transform/integral_c.hpp>
头文件 <boost/proto/transform/lazy.hpp>
头文件 <boost/proto/transform/make.hpp>
头文件 <boost/proto/transform/pass_through.hpp>
头文件 <boost/proto/transform/when.hpp>
头文件 <boost/proto/context.hpp>
头文件 <boost/proto/context/callable.hpp>
头文件 <boost/proto/context/default.hpp>
头文件 <boost/proto/context/null.hpp>
附录
附录 A:发行说明
附录 B:历史
附录 C:原理
附录 D:实现说明
附录 E:致谢

天地之间,霍雷肖,存在着比你哲学所梦想的更多的事情。

-- 威廉·莎士比亚

描述

Proto 是一个用于在 C++ 中构建嵌入式领域特定语言的框架。它提供了构建、类型检查、转换和执行表达式模板[27]的工具。更具体地说,Proto 提供了:

  • 表达式树数据结构。
  • 一种为表达式提供额外行为和成员的机制。
  • 用于从表达式构建树的运算符重载。
  • 用于定义表达式必须符合的语法的实用工具。
  • 一种用于立即执行表达式模板的可扩展机制。
  • 一组可扩展的树变换,用于应用于表达式树。

动机

表达式模板是一种先进的技术,C++ 库开发人员使用它来定义针对特定问题领域的嵌入式迷你语言。该技术已被用于创建高效且易于使用的线性代数库,以及定义具有可读语法的 C++ 解析器生成器。但是,开发这样的库需要编写大量的难以理解和维护的模板乱码。Boost.Proto 简化了领域特定嵌入式语言 (EDSL)的开发。使用 Proto 定义您的迷你语言的基元,并让 Proto 处理运算符重载和表达式解析树的构建。通过将表达式树传递给函数对象来立即评估表达式树。或者通过定义您的迷你语言的语法来转换表达式树,该语法使用 Proto 提供或由您定义的一系列树变换进行修饰。然后使用语法为您的用户提供针对无效表达式的简短且可读的语法错误!不再有乱码——使用 Proto 开发的表达式模板库是声明式的且可读的。

简而言之,Proto 是一个用于定义 EDSL 的 EDSL。

如何使用本文档

本文档使用以下命名和格式约定。

  • 代码采用 fixed width font 字体,并进行语法高亮显示。
  • 您需要提供的可替换文本采用 斜体
  • 如果名称指的是自由函数,则像这样指定:free_function();也就是说,它采用代码字体,并且其名称后跟 () 以指示它是自由函数。
  • 如果名称指的是类模板,则像这样指定:class_template<>;也就是说,它采用代码字体,并且其名称后跟 <> 以指示它是类模板。
  • 如果名称指的是类似函数的宏,则像这样指定:MACRO();也就是说,它采用代码字体中的大写字母,并且其名称后跟 () 以指示它是类似函数的宏。类似对象的宏不带尾随的 ()
  • 在通用编程意义上,指代概念的名称以 CamelCase 格式指定。
[Note] 注意

此外,诸如此类的注释指定了非必要信息,这些信息提供了额外的背景或原理。

最后,您可以将以下内容添加到本文档中的任何代码片段中

// Include all of Proto
#include <boost/proto/proto.hpp>

// Create some namespace aliases
namespace mpl = boost::mpl;
namespace fusion = boost::fusion;
namespace proto = boost::proto;

// Allow unqualified use of Proto's wildcard pattern
using proto::_;



PrevUpHomeNext