目录
欢迎使用可变参数宏数据库。
可变参数宏数据库,以下简称 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 数据类型的功能,但确实以各种方式扩展了其中一些功能,同时还为空性、VMD 标识符、VMD 类型和 VMD 序列提供了特定功能。
表 1.1. 数据类型及其示例
类型 |
示例 |
---|---|
标识符 |
anyname |
数字 |
47 |
类型 |
BOOST_VMD_TYPE_NUMBER |
数组 |
(4,(an_identifier,156,BOOST_VMD_TYPE_IDENTIFIER)) |
列表 |
(78,(some_identifier,(BOOST_VMD_TYPE_TYPE,BOOST_PP_NIL))) |
序列 |
(identifier)(89)(245) |
元组 |
(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 元组元素为空。
在 Boost PP 库中,很大一部分功能集中于操作 Boost PP 数字,特别是 Boost PP 数字 0 和 1,它们作为布尔值,您可以使用 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 库支持的数据类型之一),这不仅使最终用户能够根据受支持数据类型的值更改宏扩展逻辑,而且还能够根据预处理数据的实际类型更改宏扩展逻辑。
基于宏参数的类型确定宏扩展的能力,使宏程序员能够创建一个根据其一个或多个参数的预处理数据类型以及特定类型参数的值而以不同方式扩展的单个宏。 这允许以更灵活的方式设计宏逻辑,依赖于数据的类型和/或数据的值。如果这引起了您的兴趣,请继续阅读以了解如何使用 VMD 进行宏编程。
该库的功能可以总结为:
该库是一个仅标头库,库中的所有宏都包含在单个标头中,该标头的名称为“vmd.hpp”。单个标头可用于库中的不同功能,并在解释该功能时注明。
库中的所有宏都以序列“BOOST_VMD_”开头,以将其与最终用户可能使用的其他宏区分开来。因此,最终用户不应使用任何以序列“BOOST_VMD_”开头的 C++ 标识符(无论是在宏中还是其他情况下)。
库的使用仅依赖于 Boost PP。该库还在其自身测试中使用了 Boost detail lightweight_test.hpp。