你可以使用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
表示正在迭代的當前元素的從零開始的索引。因此,當MACRO
正在擴展時,type
是types
的i
第012個元素,而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)
一個更通用的方法是使用SEQ_ZIP
從this answer,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))
爲什麼不是一個單一的元組序列?例如。 '((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