あなたは次のようにそれを行うには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
の2番目の引数は、各呼び出しに2番目の引数としてMACRO
を渡し、i
は、反復処理中の現在の要素の0から始まるインデックスを示します。したがって、MACRO
が展開されている場合、type
はtypes
のi
番目の要素であり、BOOST_PP_SEQ_ELEM(i, funcs)
はfuncs
のi
番目の要素です。より一般的なソリューションについては
、あなたのような何かを行うことができます。
#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)
を、次のように使用します。
#define MACRO(type,func) void add(type val) { obj.func(val); }
ITERATE_OVER_TWO_SEQ(MACRO, types, funcs)
をさらに一般的な方法は、this answerからSEQ_ZIP
を使用することであろう、BOOST_PP_SEQ_FOR_EACH
および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))
なぜタプルのシーケンスは1つではありませんか?例えば。 '((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