Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 — Herb Sutter 和 Andrei Alexandrescu, C++ 编码标准

Next

第 1 章. 可变参数宏数据库 1.10

Edward Diener

目录

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

欢迎使用可变参数宏数据库。

可变参数宏数据库,以下简称 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 元组元素为空。

使用 VMD 库的优势是什么?

在 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 进行宏编程。

功能领域

该库的功能可以总结为:

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

该库是一个仅标头库,库中的所有宏都包含在单个标头中,该标头的名称为“vmd.hpp”。单个标头可用于库中的不同功能,并在解释该功能时注明。

库中的所有宏都以序列“BOOST_VMD_”开头,以将其与最终用户可能使用的其他宏区分开来。因此,最终用户不应使用任何以序列“BOOST_VMD_”开头的 C++ 标识符(无论是在宏中还是其他情况下)。

库的使用仅依赖于 Boost PP。该库还在其自身测试中使用了 Boost detail lightweight_test.hpp。


Next