gpt4 book ai didi

c++ - 如何在 BOOST_PP_IF 中扩展包含逗号的宏

转载 作者:太空狗 更新时间:2023-10-29 20:40:16 25 4
gpt4 key购买 nike

我之前问过以下问题,但解决方案似乎不适用于这种特殊情况。

How do I print out a comma multiple times using 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())()

See it work

IF 调用扩展为没有调用的宏或调用时丢弃参数的东西。选择一个后,最后一个括号使用所需参数调用它,逗号不会妨碍。

除此之外,我将 z 更改为 n 并将 TIBRA_EATEN_COMMA() 更改为 EATEN_COMMA。由于有些部分是多余的,你可以找一个更简单的版本here .

关于c++ - 如何在 BOOST_PP_IF 中扩展包含逗号的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24770614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com