BOOST_PP_AUTO_REC 做什么?

What BOOST_PP_AUTO_REC does?

我在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 的作用? 在文档中找不到任何描述。 这个宏到底是做什么用的?

BOOST_PP_AUTO_REC 帮助通过使用谓词执行二进制搜索来推导出 Automatic Recursion 中使用的递归级别。第一个参数是谓词,第二个参数是要搜索的大小。谓词将被称为 pred(n),其中 pred 是谓词,n 是值。

搜索必须有序,因此谓词 returns 0 的所有值必须出现在谓词 returns 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。