如何在BOOST_PP_IF内扩展包含逗号的宏 [英] How do I expand a macro containing commas inside a BOOST_PP_IF

查看:69
本文介绍了如何在BOOST_PP_IF内扩展包含逗号的宏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我早些时候问了以下问题,但该解决方案在这种特殊情况下似乎不起作用.

I asked the following question earlier, but the solution doesn't seem to work in this particular case.

如何打印使用Boost Preprocessor多次逗号

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆