繁体   English   中英

BOOST_PP_AUTO_REC 做什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM