2017-02-01 21 views
3

Boost Preprocessor 시퀀스를 통해 다음을 수행 할 수 있는지 궁금합니다. (대부분의 SO 질문뿐만 아니라 부스트 전처리 예제는 1 시퀀스에 대해서만 이야기합니다.)동시에 두 개의 Boost 전 처리기 시퀀스를 반복하는 방법은 무엇입니까?

#define seq1 (a)(b)(c) 
#define seq2 (1)(2)(3) 

// Now iterate over both of them at the same time 

여기 내 동기가 있습니다. 예를 들어 많은 유형에 대해 몇 가지 기능을 정의해야합니다.

void add(int val) { obj.AddInt(val); } 
void add(double val) { obj.AddDouble(val); } 

나는

#define types (int)(double)... 
#define funcs (AddInt)(AddDouble)... 

같은 두 시퀀스를 정의하는 생각을하고 함수에 대한 매크로가 두 시퀀스를 통해 추가하고, 반복 기록했다.

+0

왜 단일 시퀀스의 튜플이 필요하지 않습니까? 예 : '((int, AddInt), (double, AddDouble)) ... ... –

+0

사실 3-4 개의 시퀀스가 ​​있고이 질문을 읽었습니다 : http://stackoverflow.com/questions/26475453/how-to-use -boostpreprocessor-to-unzip-a-sequence 이 매크로는 잠재적으로 수행 할 수 있다고 생각하지만 매크로 시퀀스가 ​​이미 정의되어 있기 때문에 여러 시퀀스를 반복하는 방법이 있는지 궁금합니다. – skgbanga

+0

빠른 검색을 통해 zip 매크로가있는 라이브러리가 있다는 것을 알 수 있습니다 : https://github.com/mcinglis/libpp/blob/master/zip.h – chris

답변

3

다음과 같이 그것을 할 BOOST_PP_SEQ_FOR_EACH_IBOOST_PP_SEQ_ELEM을 사용할 수

#include <boost/preprocessor/seq/elem.hpp> 
#include <boost/preprocessor/seq/for_each_i.hpp> 

#define types (int)(double) 
#define funcs (AddInt)(AddDouble) 

#define MACRO(_,funcs,i,type) \ 
    void add(type val) { obj.BOOST_PP_SEQ_ELEM(i, funcs)(val); } 

BOOST_PP_SEQ_FOR_EACH_I(MACRO, funcs, types) 

BOOST_PP_SEQ_FOR_EACH_I 매크로 반복을 순서 types을 통해, 각 요소에 MACRO을 적용. BOOST_PP_SEQ_FOR_EACH_I의 두 번째 인수는 각 호출에 대한 두 번째 인수로 MACRO을 전달하고 i은 반복되는 현재 요소의 0부터 시작하는 인덱스를 나타냅니다. 따라서 MACRO이 확장 될 때 typetypesi 번째 요소이고 BOOST_PP_SEQ_ELEM(i, funcs)funcsi 번째 요소입니다. , BOOST_PP_SEQ_FOR_EACH

#define MACRO(type,func) void add(type val) { obj.func(val); } 
ITERATE_OVER_TWO_SEQ(MACRO, types, funcs) 

이보다 더 일반적인 방법은 this answer에서 SEQ_ZIP을 사용하는 것입니다 : 더 일반적인 솔루션을

, 당신은 같은 것을 수행 할 수 있습니다

#define ITERATE_OVER_TWO_SEQ_(_,data,i,e2) \ 
    BOOST_PP_SEQ_ELEM(0,data)(BOOST_PP_SEQ_ELEM(i, BOOST_PP_SEQ_ELEM(1,data)), e2) 
#define ITERATE_OVER_TWO_SEQ(macro, s1, s2) \ 
    BOOST_PP_SEQ_FOR_EACH_I(ITERATE_OVER_TWO_SEQ_, (macro)(s1), s2) 

을 다음과 같이 사용 및 BOOST_PP_SEQ_ELEM. 예 :

#include <boost/preprocessor/seq/for_each.hpp> 
#define MACRO(_,d,seq) \ 
    void add(BOOST_PP_SEQ_ELEM(0,seq) val) \ 
    { obj.BOOST_PP_SEQ_ELEM(1, seq)(val); } 

BOOST_PP_SEQ_FOR_EACH(MACRO, _, SEQ_ZIP((types)(funcs))