Boost C++ 库

...世界上评价最高、设计最专业 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

第 1 章。可变宏数据库 1.10 - Boost C++ 函数库
Next

第 1 章。可变宏数据库 1.10

Edward Diener

目录

介绍
命名约定
为什么以及如何使用
使用可变参数宏
Visual C++ 定义
功能组
数据类型
处理数据类型的宏
处理数据类型的特定宏
空值
宏约束
标识符
数字
类型
VMD 和 Boost PP 数据类型
标识宏和 BOOST_VMD_IS_EMPTY
总结特定的 VMD 宏
用于处理数据类型的通用宏
解析序列
转换序列
访问序列元素
获取数据类型
测试相等与不等
总结通用宏
带修饰符的宏
返回类型修饰符
过滤修饰符
标识符修饰符
拆分修饰符
索引修饰符
修饰符与单元素序列
标识符子类型
Boost PP 中不存在的有用可变宏
断言与数据类型
生成空值和标识
处理“空”序列和元组的功能
控制内部使用
Boost PP 可重入版本
输入作为动态类型
Visual C++ 中的 VMD 陷阱
版本 1.7 到 1.8 的转换
使用 VMD 功能的示例
可变宏数据参考
头文件 <boost/vmd/assert.hpp>
头文件 <boost/vmd/assert_is_array.hpp>
头文件 <boost/vmd/assert_is_empty.hpp>
头文件 <boost/vmd/assert_is_identifier.hpp>
头文件 <boost/vmd/assert_is_list.hpp>
头文件 <boost/vmd/assert_is_number.hpp>
头文件 <boost/vmd/assert_is_seq.hpp>
头文件 <boost/vmd/assert_is_tuple.hpp>
头文件 <boost/vmd/assert_is_type.hpp>
头文件 <boost/vmd/elem.hpp>
头文件 <boost/vmd/empty.hpp>
头文件 <boost/vmd/enum.hpp>
头文件 <boost/vmd/equal.hpp>
头文件 <boost/vmd/get_type.hpp>
头文件 <boost/vmd/identity.hpp>
头文件 <boost/vmd/is_array.hpp>
头文件 <boost/vmd/is_empty.hpp>
头文件 <boost/vmd/is_empty_array.hpp>
头文件 <boost/vmd/is_empty_list.hpp>
头文件 <boost/vmd/is_general_identifier.hpp>
头文件 <boost/vmd/is_identifier.hpp>
头文件 <boost/vmd/is_list.hpp>
头文件 <boost/vmd/is_multi.hpp>
头文件 <boost/vmd/is_number.hpp>
头文件 <boost/vmd/is_parens_empty.hpp>
头文件 <boost/vmd/is_seq.hpp>
头文件 <boost/vmd/is_tuple.hpp>
头文件 <boost/vmd/is_type.hpp>
头文件 <boost/vmd/is_unary.hpp>
头文件 <boost/vmd/not_equal.hpp>
头文件 <boost/vmd/seq/is_vmd_seq.hpp>
头文件 <boost/vmd/seq/pop_back.hpp>
头文件 <boost/vmd/tuple/pop_back.hpp>
头文件 <boost/vmd/seq/pop_front.hpp>
头文件 <boost/vmd/tuple/pop_front.hpp>
头文件 <boost/vmd/seq/push_back.hpp>
头文件 <boost/vmd/tuple/push_back.hpp>
头文件 <boost/vmd/seq/push_front.hpp>
头文件 <boost/vmd/tuple/push_front.hpp>
头文件 <boost/vmd/seq/remove.hpp>
头文件 <boost/vmd/tuple/remove.hpp>
头文件 <boost/vmd/seq/size.hpp>
头文件 <boost/vmd/size.hpp>
头文件 <boost/vmd/tuple/size.hpp>
头文件 <boost/vmd/seq/to_array.hpp>
头文件 <boost/vmd/to_array.hpp>
头文件 <boost/vmd/tuple/to_array.hpp>
头文件 <boost/vmd/seq/to_list.hpp>
头文件 <boost/vmd/to_list.hpp>
头文件 <boost/vmd/tuple/to_list.hpp>
头文件 <boost/vmd/array/to_seq.hpp>
头文件 <boost/vmd/list/to_seq.hpp>
头文件 <boost/vmd/to_seq.hpp>
头文件 <boost/vmd/tuple/to_seq.hpp>
头文件 <boost/vmd/array/to_tuple.hpp>
头文件 <boost/vmd/list/to_tuple.hpp>
头文件 <boost/vmd/seq/to_tuple.hpp>
头文件 <boost/vmd/to_tuple.hpp>
头文件 <boost/vmd/tuple/is_vmd_tuple.hpp>
设计
编译器
历史
致谢
索引

欢迎使用可变宏数据库。

本文档 hereafter 简称 VMD 的可变宏数据库是一个可变宏库,它增强了 Boost 预处理器库 (Boost PP) 的功能,尤其是在与预处理器数据类型相关的方面。

在 Boost PP 库中,具有特定功能的预处理器数据类型是数字(0 到 BOOST_PP_LIMIT_MAG 之间的值)和复合数据类型 Boost PP 数组、Boost PP 列表、Boost PP 序列和 Boost PP 元组。

VMD 具有特定功能的预处理器数据类型与 Boost PP 库相同,此外还有以下预处理器数据类型:空、VMD 标识符、VMD 类型(标识符的子集)以及 VMD 序列,这是一个复合数据类型。序列是零个或多个之前提到的、由 VMD 库支持的预处理器数据类型,按顺序排列在一起。

VMD 库不以任何方式复制 Boost PP 数据类型的功能,但通过各种方式扩展了其中一些功能,同时还为 emptiness、VMD 标识符、VMD 类型和 VMD 序列提供了特定功能。

数据类型示例

表 1.1。带有示例的数据类型

类型

示例

标识符

任意名称

number

47

type

BOOST_VMD_TYPE_NUMBER

数组

(4,(an_identifier,156,BOOST_VMD_TYPE_IDENTIFIER))

list

(78,(some_identifier,(BOOST_VMD_TYPE_TYPE,BOOST_PP_NIL)))

序列

(identifier)(89)(245)

tuple

(any_id,175,BOOST_VMD_TYPE_LIST,happy,21)

序列

tree 59 (56,BOOST_VMD_TYPE_SEQ) (128)(fire)(clown) (47,(BOOST_VMD_TYPE_TUPLE,BOOST_PP_NIL))


我们经常说一个宏扩展为空,或者一个宏被传递了空参数。与其使用“空”这个在 C++ 编程术语中有多种含义的词,不如将预处理器的这种机制称为“空”。

空是指没有任何预处理标记。一个扩展为空的宏,如

#define RETURN_NOTHING(x)

据称会返回空。反之,一个在调用时可以接受空的宏,例如

RETURN_NOTHING()

据称可以接受空,或不接受任何预处理标记。

最后,空可以作为任何复合数据类型的一部分,例如

(45,,some_name)

其中第二个 Boost PP 元组元素为空。

使用 VMD 库有什么优势?

在 Boost PP 库中,相当多的功能集中在操作 Boost PP 数字上,特别是 0 和 1 的 Boost PP 数字作为布尔值,您可以使用 Boost PP 预处理逻辑在编写宏时采取不同的预处理路径。换句话说,在使用 Boost PP 时,宏的逻辑通常基于 Boost PP 数字的值。这是因为 Boost PP 数字可以与其他数字进行相等性或不等性比较,以及其他类型的比较,而利用这种比较 Boost PP 数字能力的 Boost PP 宏,例如 Boost PP 宏 BOOST_PP_IF 或 BOOST_PP_IIF,可以根据此类比较的结果选择不同的宏展开路径。

Boost VMD 库在 Boost PP 数字的比较基础上,增加了比较其任何其他数据类型的相等性或不等性的能力,从而允许宏的逻辑依赖于其支持的任何预处理器数据类型的值。

更重要的是,Boost VMD 库能够发现预处理数据的类型,如果该数据是 VMD 库支持的数据类型之一,这将使最终用户不仅能够根据支持的数据类型的值改变宏展开逻辑,还能根据预处理数据的实际类型改变宏展开逻辑。

根据宏参数的类型确定宏展开的能力,使宏程序员能够创建一个单一宏,该宏根据一个或多个参数的预处理数据类型以及特定类型参数的值而展开不同。这使得宏逻辑的设计更加灵活,可以依赖于数据类型和/或数据的 {0}。如果您对此感兴趣,请继续阅读,了解如何使用 VMD 进行宏编程。

功能领域

该库的功能可以概括为:

  1. 提供一种更好的方式来测试和使用空参数和空预处理器数据。
  2. 提供测试/解析 VMD 标识符、Boost PP 数字、VMD 类型、Boost PP 元组、Boost PP 数组、Boost PP 列表和 Boost PP 序列的方法。
  3. 提供测试/解析 VMD 标识符、Boost PP 数字、VMD 类型、Boost PP 元组、Boost PP 数组、Boost PP 列表和 Boost PP 序列的 VMD 序列的方法。
  4. 提供一些 Boost PP 中不存在的有用可变宏。

该库是仅头文件的库,库中的所有宏都包含在一个名为 'vmd.hpp' 的单个头文件中。可以为库中不同的功能使用单独的头文件,在解释该功能时会进行说明。

库中的所有宏都以 'BOOST_VMD_' 开头,以区分最终用户可能使用的其他宏。因此,最终用户不应使用任何以 'BOOST_VMD_' 开头的 C++ 标识符,无论是宏还是其他。

使用该库仅依赖于 Boost PP。该库还使用 Boost detail lightweight_test.hpp 进行自身测试。


Next