如何同时迭代两个Boost预处理器序列?

时间:2017-02-01 14:55:16

标签: c++ c boost c-preprocessor boost-preprocessor

我想知道是否可以通过Boost预处理器序列完成以下操作。 (大多数SO问题以及Boost预处理器示例仅涉及1个序列)

#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)...

然后为函数add编写一个宏,并迭代这两个序列。

1 个答案:

答案 0 :(得分:4)

您可以使用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时,typei的{​​{1}}元素,而typesBOOST_PP_SEQ_ELEM(i, funcs)元素i

对于更通用的解决方案,您可以执行以下操作:

funcs

并按如下方式使用:

#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)

更通用的方法是使用this answer#define MACRO(type,func) void add(type val) { obj.func(val); } ITERATE_OVER_TWO_SEQ(MACRO, types, funcs) SEQ_ZIP中的BOOST_PP_SEQ_FOR_EACH。例如:

BOOST_PP_SEQ_ELEM