BOOST_PP_AUTO_REC的作用是什么?

时间:2016-09-26 11:06:33

标签: c++ boost c-preprocessor boost-preprocessor

我遇到过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的作用吗? 在文档中找不到任何描述。 这个宏实际上是为了什么?

1 个答案:

答案 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。

相关问题