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))