Застрял на такой задачи не могу придумать решение:
Имеется макрос который возвращает сиквенс состоящий из 0 и 1 например (0)(1)(0)
Нужно сделать между всеми элементами сиквенса операцию
BOOST_PP_OR.
т.е.
BOOST_PP_OR(0,BOOST_PP_OR(1,0)) -> это должно в результате раскрыться в 1
Написал вот такой код:
#define _HBDB_SYNC_OPARENTHNESS() (
#define _HBDB_SYNC_CPARENTHNESS() )
#define MACRO_S( z, n, data ) \
BOOST_PP_CAT(BOOST_PP_CAT(foo, BOOST_PP_CAT(_HBDB_SYNC_OPARENTHNESS(), BOOST_PP_SEQ_ELEM(n, data))),BOOST_PP_COMMA())
#define MACRO_F( z, n, data ) \
_HBDB_SYNC_CPARENTHNESS()
#define _HBDB_SYNC_OR( seq ) \
BOOST_PP_REPEAT( BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), MACRO_S, seq ) \
BOOST_PP_SEQ_ELEM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)),seq) \
BOOST_PP_REPEAT( BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), MACRO_F, seq )
пока там написано
foo (для тестирования макроса), раскрывается всё как нужно:
foo(0, foo(1, 0 ) )
если вместо
foo написать
BOOST_PP_OR получается такое:
BOOST_PP_BITOR_0BOOST_PP_BOOL(BOOST_PP_OR(0,)00 BOOST_PP_BITOR_1BOOST_PP_BOOL(BOOST_PP_OR(1,)11 0 ) )
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, nen777w, Вы писали:
N>>Застрял на такой задачи не могу придумать решение:
N>>Имеется макрос который возвращает сиквенс состоящий из 0 и 1 например (0)(1)(0)
N>>Нужно сделать между всеми элементами сиквенса операцию BOOST_PP_OR.
N>>т.е.
J>Я твой код не прогонял, но такое чувство, что ты делаешь что-то не то, простого FOLD должно быть достаточно.
Проблему решил!!
#define MACRO_S( z, n, data ) \
BOOST_PP_BITOR _HBDB_SYNC_OPARENTHNESS() BOOST_PP_SEQ_ELEM(n, data) BOOST_PP_COMMA()
Про FOLD не знал. Спасибо! Как то раньше не замечал его.