2017-02-01 46 views
3

我想知道是否可以通過Boost預處理器序列完成以下操作。 (大多數SO問題以及Boost預處理器示例僅討論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表示正在迭代的當前元素的從零開始的索引。因此,當MACRO正在擴展時,typetypesi第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_ZIPthis answerBOOST_PP_SEQ_FOR_EACHBOOST_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)) 
相關問題