如何在BOOST_PP_IF内扩展包含逗号的宏 [英] How do I expand a macro containing commas inside a BOOST_PP_IF
问题描述
我早些时候问了以下问题,但该解决方案在这种特殊情况下似乎不起作用.
I asked the following question earlier, but the solution doesn't seem to work in this particular case.
我正在尝试有条件地扩展包含逗号的宏.这是一个说明问题的示例:
I am trying to expand a macro containing a comma conditionally. Here is an example illustrating the problem:
#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
BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF BOOST_PP_IIF
何时应扩展到
0,0 1,1 2,2 3,3
0,0 1,1 2,2 3,3
推荐答案
您可以先选择宏然后再调用它来延迟调用宏:
You can delay invoking your macro by first selecting it and then invoking it:
#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
调用扩展为没有调用的宏,或者扩展为在调用时丢弃参数的宏.选择一个后,最后一个括号会使用所需的参数调用它,而不会引起逗号的干扰.
The IF
invocation expands to either your macro without an invocation or something that discard arguments when invoked. After one is chosen, the last parentheses invoke it with the desired arguments without the commas getting in the way.
除此之外,我将 z
更改为 n
,并将 TIBRA_EATEN_COMMA()
更改为 EATEN_COMMA
.由于某些部分是多余的,因此可以在此处找到简单的版本.
Apart from that, I changed z
to n
and TIBRA_EATEN_COMMA()
to EATEN_COMMA
. As some parts are redundant, you can find a simpler version here.
这篇关于如何在BOOST_PP_IF内扩展包含逗号的宏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!