2016-09-26 9 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 도움말은 술어를 사용하여 2 진 검색을 수행하여 Automatic Recursion에 사용 된 재귀 수준을 추론합니다. 첫 번째 인수는 술어이고 두 번째 인수는 검색 될 크기입니다. 술어는 pred(n)이라고하며, pred이 술어이고 n이 값입니다.

검색이 주문해야

때문에 매크로가 Automatic Recursion에 사용되는, 때문에 술어가 0이 술어가 1

을 반환하는 모든 값 앞에 와야 반환하는 모든 값이 술어는 사용할 수없는 자동 재귀를 사용하는 매크로.

는 예를 들어, 반복의 조건은 다음과 같이 정의된다 : BOOST_PP_REPEAT_1가 재귀 적으로 호출되는 경우

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

폴 푸르트 답변 해 주셔서 감사합니다. 이제는 저에게 분명합니다. 불행히도 아직 완전히. 어쩌면 나는 강철을 놓칠지도 모른다. 예를 들어 : 부스트 선언에서 우리가 #이는 가 BOOST_PP_CAT (BOOST_PP_ENUM_이 BOOST_PP_AUTO_REC (BOOST_PP_REPEAT_P, 4))은 항상 확장 그럼, 왜 단지를 BOOST_PP_ENUM_1하는 BOOST_PP_ENUM BOOST_PP_CAT (4) BOOST_PP_ENUM_, BOOST_PP_AUTO_REC (BOOST_PP_REPEAT_P) 정의 으로 정의하지 마라. #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-PreprocessorMetaprogramming.html#horizontal-repetition –

+0

Paul Fultz에게 다시 한번 감사드립니다. 당신의 설명 때문에 모든 것을 완전히 이해했습니다. –