Изменение BOOST_PP_SEQ - PullRequest
0 голосов

У меня есть последовательность: (a)(1)(b)(2)(c)(3), и я хочу расширить ее до: a_b_c, какие решения? Я пробовал BOOST_PP_SEQ_FOLD_LEFT vs BOOST_PP_SEQ_FILTER, но безуспешно, получилось: a1b2c3 ... Помогите)

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете сделать что-то вроде этого (я не могу гарантировать, что это лучший подход):

#define DO_CONCAT_WITH_UNDERSCORE(__,STATE,ELEM) BOOST_PP_CAT(STATE,BOOST_PP_CAT(_,ELEM))
#define DO_FILTER_POSITION(_,__,INDEX,ELEM) BOOST_PP_IF(BOOST_PP_MOD(INDEX,2),BOOST_PP_EMPTY(),(ELEM)) //IF IT'S ODD ADD NOTHING, IF IT'S EVEN ADD THE CURRENT ELEM IN PARENS
#define TAKE_EVEN_POSITIONS(SEQ) BOOST_PP_SEQ_FOR_EACH_I(DO_FILTER_POSITION,_,SEQ)
#define TAKE_EVEN_POSITIONS_AND_CONCAT_HELPER(FILTERED_SEQ) BOOST_PP_SEQ_FOLD_LEFT(DO_CONCAT_WITH_UNDERSCORE,BOOST_PP_SEQ_HEAD(FILTERED_SEQ),BOOST_PP_SEQ_TAIL(FILTERED_SEQ))
#define TAKE_EVEN_POSITIONS_AND_CONCAT(SEQ) TAKE_EVEN_POSITIONS_AND_CONCAT_HELPER(TAKE_EVEN_POSITIONS(SEQ))

Запуск на Wandbox

...