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。
我在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。