2016-09-29 8 views
3

의 순서를 구문 분석하는 부스트? 내가 얻을 수 있어요 대부분에서사용</p> <pre><code>#define TYPES (height,int,10)(width,int,20) </code></pre> <p>어떻게 이런 부스트 처리기 뭔가를 사용하여이 매크로를 확장되는 I 매크로가 정의 처리기 요소

int height = 10; 
int width = 20; 

높이, INT, 10폭, INT, 문자열로 20하지만 구문 분석 할 수있는 개별 요소입니다. 거기에 질식하지 않는 BOOST_PP_SEQ_FOR_EACH 있도록 처리 이전 ((height,int,10))((width,int,20))TYPES을 설정하는 사용자 지정 매크로의 핀치를 사용

답변

4

:

#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0(...) \ 
    ((__VA_ARGS__)) GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_1 

#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_1(...) \ 
    ((__VA_ARGS__)) GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0 

#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0_END 
#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_1_END 

// Double the parentheses of a Boost.PP sequence 
// I.e. (a, b)(c, d) becomes ((a, b))((c, d)) 
#define GLK_PP_SEQ_DOUBLE_PARENS(seq) \ 
    BOOST_PP_CAT(GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0 seq, _END) 


#define MAKE_ONE_VARIABLE(r, data, elem) \ 
    BOOST_PP_TUPLE_ELEM(1, elem) BOOST_PP_TUPLE_ELEM(0, elem) = BOOST_PP_TUPLE_ELEM(2, elem); 

#define MAKE_VARIABLES(seq) \ 
    BOOST_PP_SEQ_FOR_EACH(MAKE_ONE_VARIABLE, ~, GLK_PP_SEQ_DOUBLE_PARENS(seq)) 

사용법 :

#define TYPES (height,int,10)(width,int,20) 

int main() { 
    MAKE_VARIABLES(TYPES) 
} 

가로 전처리 :

int main() { 
    int height = 10; int width = 20; 
} 

See it live on Coliru

+0

부스트를하지 않아도 GLK_PP_SEQ_DOUBLE_PARENS와 (과) 비슷한 항목이 있습니까? – James

+0

@Phantom 내가 아는 것은 아니지만, 불행히도. – Quentin