Как заархивировать несколько последовательностей Boost Preprocessor?

Учитывая несколько последовательностей Boost Preprocessor:

#define S1 (a)(b)(c)
#define S2 (1)(2)(3)
#define S3 (x1)(x2)(x3)

Как мне сжать их, используя препроцессор, чтобы конечный результат был ((a)(1)(x1))((b)(2)(x2))((c)(3)(x3))?

Заметки

  • Я пришел с собственным ответом, но я открыт для принятия более эффективных решений, чем предусмотрено в моем ответе ниже, в разумные сроки.
  • Пожалуйста, воздержитесь от удаления тега c, так как этот Boost.Preprocessor хорошо работает как с C++, так и с C, и мой вопрос нацелен на оба языка.

1 ответ

Решение

Вы можете определить SEQ_ZIP макрос для этой цели выглядит следующим образом:

#include <boost/preprocessor/control/expr_if.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/seq/size.hpp>

#define SEQ_ZIP_NTH_(_,d,e) (BOOST_PP_SEQ_ELEM(d, e))
#define SEQ_ZIP_NTHS_(_,i,ss) (BOOST_PP_SEQ_FOR_EACH(SEQ_ZIP_NTH_,i,ss))
#define SEQ_ZIP_2(ne,ss) BOOST_PP_REPEAT(ne, SEQ_ZIP_NTHS_, ss)
#define SEQ_ZIP_(ne,ss) BOOST_PP_EXPR_IF(ne, SEQ_ZIP_2(ne, ss))
#define SEQ_ZIP(ss) SEQ_ZIP_(BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_ELEM(0,ss)), ss)

И используйте это, чтобы сжать Ваши последовательности как это:

#define S1 (a)(b)(c)
#define S2 (1)(2)(3)
#define S3 (x1)(x2)(x3)
SEQ_ZIP((S1)(S2)(S3))
Другие вопросы по тегам