Boost C++ 库

……世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码规范

PrevUpHomeNext

第 32 章: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++ 中构建嵌入式领域特定语言 (EDSL) 的框架。它提供用于构建、类型检查、转换和执行表达式模板[32]的工具。更具体地说,Proto 提供:

  • 表达式树数据结构。
  • 为表达式提供附加行为和成员的机制。
  • 用于从表达式构建树的操作符重载。
  • 用于定义表达式必须符合的语法的实用程序。
  • 一种可扩展的机制,用于立即执行表达式模板。
  • 一组可扩展的树转换,应用于表达式树。

动机

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

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

如何使用本文档

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

  • 代码使用等宽字体显示,并带有语法高亮。
  • 您需要提供的可替换文本使用斜体显示。
  • 如果名称指的是自由函数,则指定如下:free_function();也就是说,它采用代码字体,并且名称后面跟有()表示它是一个自由函数。
  • 如果名称指的是类模板,则指定如下:class_template<>;也就是说,它采用代码字体,并且名称后面跟有<>表示它是一个类模板。
  • 如果名称指的是类似函数的宏,则指定如下:MACRO();也就是说,它采用代码字体大写,并且名称后面跟有()表示它是一个类似函数的宏。对象式宏则不带尾随的()
  • 指代泛型编程意义上概念的名称使用驼峰命名法。
[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