如何在BOOST_PP_IF中展开包含逗号的宏

qua*_*ant 3 c++ boost-preprocessor

我之前提出过以下问题,但解决方案在这种特殊情况下似乎不起作用.

如何使用Boost预处理器多次打印逗号

我试图有条件地扩展包含逗号的宏.这是一个说明问题的示例:

#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)
Run Code Online (Sandbox Code Playgroud)

这扩展到

BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF

什么时候应该扩展到

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

chr*_*ris 5

您可以通过先选择它然后调用它来延迟调用宏:

#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())()
Run Code Online (Sandbox Code Playgroud)

看得出来了

IF调用扩展为您的宏不被调用时丢弃的参数调用什么的.选择一个之后,最后一个括号使用所需的参数调用它,而不会使逗号妨碍.

除此之外,我改变了znTIBRA_EATEN_COMMA()EATEN_COMMA.由于某些部分是多余的,您可以在这里找到更简单的版本.