我遇到过boost define
# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
有人能解释BOOST_PP_AUTO_REC的作用吗? 在文档中找不到任何描述。 这个宏实际上是为了什么?
答案 0 :(得分:1)
BOOST_PP_AUTO_REC
帮助通过使用谓词执行二进制搜索来推断Automatic Recursion中使用的递归级别。第一个参数是谓词,第二个参数是要搜索的大小。谓词将被称为pred(n)
,其中pred
是谓词,n
是值。
必须对搜索进行排序,因此谓词返回0的所有值必须在谓词返回1的所有值之前。
由于宏用于Automatic Recursion,谓词不能使用任何采用自动递归的宏。
例如,repeat的谓词定义如下:
# 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))
#
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL 1
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1(c, m, d) 0
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_2(c, m, d) 0
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_3(c, m, d) 0
因此,如果递归调用BOOST_PP_REPEAT_1
,则不会扩展。因此,当它与BOOST_PP_REPEAT_CHECK_
进行联接时,它将扩展为BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1
,这将扩展为0
。但是,如果BOOST_PP_REPEAT_1
没有被递归调用,那么它将扩展为BOOST_PP_NIL
,然后与BOOST_PP_REPEAT_CHECK_
进行对比以生成1
。
因此谓词设置为检测其中一个BOOST_PP_REPEAT_n
宏是否可以扩展。然后BOOST_PP_AUTO_REC
将执行二进制搜索以找到可以展开的第一个。在BOOST_PP_REPEAT
的情况下,它只会搜索4个递归级别,但其他宏(如BOOST_PP_WHILE
的递归深度最多为256。