Ранее я задал следующий вопрос, но, похоже, решение не работает в данном конкретном случае.
Как распечатать запятую несколько раз, используя 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
Вы можете отложить вызов макроса, сначала выбрав его, а затем вызвав его:
#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
, Поскольку некоторые части являются избыточными, вы можете найти более простую версию Вот.