当前位置: 首页 > news >正文

boost之preprocessor

简介

preprocessor是一些宏处理的库。在看signal2代码时,看在不支持c11变参数模板时,会使用到该库中的内容

signal2模板参数

在不支持变参模板时,使用该宏来定义模板参数

#define BOOST_SIGNALS2_SIGNATURE_TEMPLATE_DECL(arity) \typename R BOOST_PP_COMMA_IF(arity) \BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(arity), typename T)

BOOST_PP_COMMA_IF:如果arity为非0,则是逗号,否则为空
BOOST_PP_INC:将arity加1
BOOST_PP_ENUM_SHIFTED_PARAMS:该宏有些复杂

BOOST_PP_ENUM_SHIFTED_PARAMS

#define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)

BOOST_PP_DEC_:如果count为0,保持不变,否则为count-1
BOOST_PP_REPEAT:其定义为

# define BOOST_PP_REPEAT BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))

BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4):宏变换为BOOST_PP_NODE_2(BOOST_PP_REPEAT_P)(BOOST_PP_REPEAT_P),因为BOOST_PP_NODE_2宏定义为

#define BOOST_PP_NODE_2(p) BOOST_PP_IIF(p(2), BOOST_PP_NODE_1, BOOST_PP_NODE_3)

其中p(2)BOOST_PP_REPEAT_P(2),宏BOOST_PP_REPEAT_P定义为

#define BOOST_PP_REPEAT_P(n) BOOST_PP_CAT(BOOST_PP_REPEAT_CHECK_, BOOST_PP_REPEAT_ ## n(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL))

所以BOOST_PP_REPEAT_P(2)

BOOST_PP_CAT(BOOST_PP_REPEAT_CHECK_, BOOST_PP_REPEAT_ 2(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL))

其使用的宏有

# define BOOST_PP_REPEAT_2(c, m, d) BOOST_PP_REPEAT_2_I(c, m, d)
# define BOOST_PP_REPEAT_2_I(c, m, d) BOOST_PP_REPEAT_2_ ## c(m, d)
# define BOOST_PP_REPEAT_2_1(m, d) m(3, 0, d)

所以BOOST_PP_REPEAT_ 2(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL)替换后为BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3(3,0,d),而BOOST_PP_TUPLE_EAT_3宏为

# define BOOST_PP_TUPLE_EAT_3(e0, e1, e2)

所以BOOST_PP_REPEAT_ 2(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL)最终替换后为BOOST_PP_NIL
所以BOOST_PP_REPEAT_P(2)最终替换为BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL,而
其定义为

# define BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL 1

BOOST_PP_NODE_2(BOOST_PP_REPEAT_P)(BOOST_PP_REPEAT_P)替换为BOOST_PP_NODE_1(BOOST_PP_REPEAT_P)
由于

#define BOOST_PP_NODE_1(p) BOOST_PP_IIF(p(1), 1, 2)

上面继续替换为BOOST_PP_IIF(BOOST_PP_REPEAT_P(1), 1, 2)
相关宏有

# define BOOST_PP_REPEAT_1(c, m, d) BOOST_PP_REPEAT_1_I(c, m, d)
# define BOOST_PP_REPEAT_1_I(c, m, d) BOOST_PP_REPEAT_1_ ## c(m, d)

BOOST_PP_NODE_1(BOOST_PP_REPEAT_P)替换为1
所以BOOST_PP_REPEAT宏替换后为BOOST_PP_REPEAT_1
则宏BOOST_PP_ENUM_SHIFTED_PARAMS替换后为

#define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_REPEAT_1(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)

继续替换后为

#define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_REPEAT_1_<count-1>(BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)

形式为

#define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_ENUM_SHIFTED_PARAMS_M(2, 0, param) BOOST_PP_ENUM_SHIFTED_PARAMS_M(2, 1, param) ....

相关宏为

# define BOOST_PP_ENUM_SHIFTED_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(param, BOOST_PP_INC(n))

相关文章:

  • 12.LCD、FSMC和ILI9341芯片
  • GitLab-CI简介
  • 深入理解 JavaScript 面向对象编程与 Class
  • git子模块--常见操作
  • c++学习之---stack,queue
  • iOS App启动优化(冷启动、热启动)
  • uni-app学习笔记十二-vue3中创建组件
  • Python实战:轻松连接与高效操作Elasticsearch
  • 【大模型应用开发】Qwen2.5-VL-3B识别视频
  • 解决WPF短暂的白色闪烁(白色闪屏)
  • 免费开源 PDF 阅读器 自带虚拟打印机功能 多格式兼容
  • Acrobat 中 JavaScript 为 PDF 带来的交互
  • Java21 并发处理说明
  • 通过Auto平台与VScode搭建远程开发环境(以Stable Diffusion Web UI为例)
  • 【Python】1. 基础语法(1)
  • 棒球比赛暗号百科·棒球1号位
  • 在Mathematica中,使用鸟枪法求解在无穷远处的边值常微分方程
  • AI助力,制作视频裁剪软件
  • Spring Cloud Sleuth与Zipkin深度整合指南:微服务链路追踪实战
  • 大剧院订座系统源码,大剧院订票,大剧院场馆租赁,大剧院订票系统完整源码
  • 哪个找房网站好/软文推广案例大全
  • 做网站建设与推广企业/天津seo排名收费
  • 门户网站模板源码/seo运营是什么意思
  • 美国少年 建设网站/一键生成app制作器
  • 企业网站建设市场报价/快速排名优化系统
  • 便宜手机网站建设/seo优化服务公司