[英]What BOOST_PP_AUTO_REC does?
我在提升定义中遇到
# 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
是值。
搜索必须是有序的,因此谓词返回 0 的所有值必须出现在谓词返回 1 的所有值之前。
由于宏用于自动递归,因此谓词不能使用任何采用自动递归的宏。
例如,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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.