当前位置: 首页 > 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))
http://www.xdnf.cn/news/639343.html

相关文章:

  • 人工智能(AI)技术包括哪些技术
  • TCP 协议的相关特性
  • How to balance work and personal life?
  • 前端流行框架Vue3教程:28. Vue应用
  • PostgreSQL windows安装
  • Vue3编译器:静态提升原理
  • VBox共享文件夹
  • 2025一带一路暨金砖国家技能发展与技术创新大赛第三届企业信息系统安全赛项
  • Go语言--语法基础5--基本数据类型--循环语句
  • [ACTF新生赛2020]easyre
  • Bolt.new:重塑 Web 开发格局的 AI 利器
  • MFC:获取所有打印机的名称(打印机模块-2)
  • 【Siggraph Asia 2023】低光增强Diffusion-Low-Light-main(引入diffusion与DWT) -- part1论文精读
  • AutoGen SelectorGroupChat 示例:社会热搜话题事件榜单
  • 成功解决ImportError: cannot import name ‘DTensor‘ from ‘torch.distributed.tensor‘
  • 选择排序算法研究
  • 【NIPS 2024】Towards Robust Multimodal Sentiment Analysis with Incomplete Data
  • C++异步(1)
  • [Protobuf] 快速上手:安全高效的序列化指南
  • SymAgent:一种用于知识图谱复杂推理的神经符号自学Agent框架
  • Oracle中的[行转列]与[列转行]
  • 【目标检测】【医学图像目标检测】BGF-YOLO:脑肿瘤检测的多尺度注意力特征融合
  • 【linux】systemctl基本语法
  • 康佳Java开发面试题及参考答案
  • 前端vue3实现图片懒加载
  • 【LCEL深度解析】LangChain表达式语言的工程化实践指南
  • 基于stm32单片机的智能盲杖研究
  • # YOLO11解决方案之区域追踪探索
  • Python 数据类型方法(1)
  • Docker 一键部署倒计时页面:Easy Countdown全设备通用