2016-09-26 83 views
1

我在升压满足定义BOOST_PP_AUTO_REC做什么?

# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4)) 

谁能解释BOOST_PP_AUTO_REC做什么? 在文档中找不到任何说明。 这个宏实际用于什么?

回答

1

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

搜索必须是有序的,所以它断言返回0,其断言返回1.

所有值之前,一定要来,因为宏用于Automatic Recursion所有值,谓语不能使用任何使用自动递归的宏。

例如,对于重复谓词的定义是这样的:

# 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.

+0

Paul Fultz感谢您的回答。现在对我来说很清楚。不幸的是尚未完全。我可能会错过钢铁。 例如: 在升压声明,我们有 #定义BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_,BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P,4)) 的BOOST_PP_CAT(BOOST_PP_ENUM_,BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P,4))始终扩展到BOOST_PP_ENUM_1 那么,为什么单单不要声明为 #define BOOST_PP_ENUM BOOST_PP_ENUM_1 –

+0

如果从'BOOST_PP_REPEAT'宏调用'BOOST_PP_ENUM',它将不会扩展为'BOOST_PP_ENUM_1',如下例所示:http://www.boost.org/doc/libs /1_61_0/libs/preprocessor/doc/AppendixA-AnIntroductiontoPreprocessorMetaprogramming.html#horizo​​ntal-repetition –

+0

Paul Fultz再次感谢您。 因为你的解释,我完全理解了一切。 –