다음과 같이 그것을 할 BOOST_PP_SEQ_FOR_EACH_I
및 BOOST_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
이 확장 될 때 type
은 types
의 i
번째 요소이고 BOOST_PP_SEQ_ELEM(i, funcs)
은 funcs
의 i
번째 요소입니다. , 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))
왜 단일 시퀀스의 튜플이 필요하지 않습니까? 예 : '((int, AddInt), (double, AddDouble)) ... ... –
사실 3-4 개의 시퀀스가 있고이 질문을 읽었습니다 : http://stackoverflow.com/questions/26475453/how-to-use -boostpreprocessor-to-unzip-a-sequence 이 매크로는 잠재적으로 수행 할 수 있다고 생각하지만 매크로 시퀀스가 이미 정의되어 있기 때문에 여러 시퀀스를 반복하는 방법이 있는지 궁금합니다. – skgbanga
빠른 검색을 통해 zip 매크로가있는 라이브러리가 있다는 것을 알 수 있습니다 : https://github.com/mcinglis/libpp/blob/master/zip.h – chris