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

标签 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 编写一个宏,并迭代这两个序列。

最佳答案

你可以使用 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 时,typetypesBOOST_PP_SEQ_ELEM 的第 i 个元素(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 answerSEQ_ZIP , BOOST_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))

关于c++ - 如何同时迭代两个 Boost 预处理器序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41982791/

相关文章:

c++ - 错误 : undefined reference to `bbque::Event::Event()' on . ../boost/serialization/access.hpp:132

c++ - 为什么++(* p)更改指针值?

c++ - 双括号?

c - 直接将 double 结果分配给 int 时的精度损失/舍入差异

C union -请解释

在 boost::shared_ptr operator bool() 上旋转时需要 C++ volatile?

c++ - OpenGL 多渲染目标和多重采样

c - strncmp 在 ObjectARX 2018 中不起作用

c++ - 使用 C++ Boost 或 STL 和 Mysql 存储和检索图像

c++ - 为什么使用一个 vs 另一个 : `boost::shared_array` VS `boost::shared_ptr<std::vector>` ?