Как развернуть макрос, содержащий запятые внутри BOOST_PP_IF

Ранее я задал следующий вопрос, но, похоже, решение не работает в данном конкретном случае.

Как распечатать запятую несколько раз, используя Boost Preprocessor

Я пытаюсь расширить макрос, содержащий запятую условно. Вот пример, иллюстрирующий проблему:

#define TEST(...)\
BOOST_PP_REPEAT( \
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \
MACRO, \
BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))

#define MACRO(z, n, data) BOOST_PP_IF(1,MACRO_CONTAINING_COMMA(z, z),MACRO_CONTAINING_COMMA(z, z))

#define MACRO_CONTAINING_COMMA(_NAME, _NAME2) _NAME TIBRA_EATEN_COMMA() _NAME2

#define EATEN_COMMA BOOST_PP_IF(1,BOOST_PP_COMMA,BOOST_PP_TUPLE_EAT())
TEST(1,2,3,4)

Это расширяется до

BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF

Когда это должно расшириться до

0,0 1,1 2,2 3,3

2

Решение

Вы можете отложить вызов макроса, сначала выбрав его, а затем вызвав его:

#define TEST(...)\
BOOST_PP_REPEAT( \
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \
MACRO, \
BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))

#define MACRO(z, n, data) BOOST_PP_IF(1,MACRO_CONTAINING_COMMA,MACRO_CONTAINING_COMMA)(n, n)

#define MACRO_CONTAINING_COMMA(_NAME, _NAME2) _NAME EATEN_COMMA _NAME2

#define EATEN_COMMA BOOST_PP_IF(1,BOOST_PP_COMMA,BOOST_PP_TUPLE_EAT())()

Смотри это работает

IF вызов распространяется либо на ваш макрос без вызова, либо на что-то, что отбрасывает аргументы при вызове. После того, как один из них выбран, последние круглые скобки вызывают его с нужными аргументами без запятых.

Кроме того, я изменил z в n а также TIBRA_EATEN_COMMA() в EATEN_COMMA, Поскольку некоторые части являются избыточными, вы можете найти более простую версию Вот.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector