2017-02-01 15 views
3

Boost Preprocessorシーケンスで以下のことができるかどうか疑問に思っていました。 (ほとんどのSO質問だけでなく、Boost Preprocessorの例では1つのシーケンスしか話さない)同時に2つの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); } 

私は、機能追加のためのマクロを作成し、2つの配列を反復その後、

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

のように二つの配列を定義することを考えていたと。

+0

なぜタプルのシーケンスは1つではありませんか?例えば。 '((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の2番目の引数は、各呼び出しに2番目の引数としてMACROを渡し、iは、反復処理中の現在の要素の0から始まるインデックスを示します。したがって、MACROが展開されている場合、typetypesi番目の要素であり、BOOST_PP_SEQ_ELEM(i, funcs)funcsi番目の要素です。より一般的なソリューションについては

、あなたのような何かを行うことができます。

#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)) 
関連する問題