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

How do I print out a comma multiple times using Boost Preprocessor

本文关键字:打印 何使用 Boost 预处理 处理器      更新时间:2023-10-16

我需要使用可变宏来扩展到一个类的多个变体。由于它们需要根据宏输入具有不同的名称,所以我不能简单地使用模板。问题是我无法展开逗号(,)符号,并且我的类具有接受多个参数的函数(为此我需要使用逗号符号)。

boost提供了扩展为逗号的BOOST_PP_COMMA()宏,但它只在循环构造之外工作。我猜问题是BOOST_PP_COMMA()展开一次,然后作为逗号处理,此时程序中断。

为了说明这个问题,假设我有一个宏函数,它接受可变数量的参数,并产生与给定参数数量相等的逗号。简单的解决方案是:

#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,BOOST_PP_COMMA(),BOOST_PP_COMMA())

但是这会产生一系列错误,因为逗号被展开了,宏认为它们是分隔参数。

有办法解决这个问题吗?

使用BOOST_PP_REPEAT和一个可以用预期参数调用的宏将工作得很好,它甚至可以防止需要BOOST_PP_COMMA:

#define PRINT_COMMAS(...)
    BOOST_PP_REPEAT( 
        BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 
        PRINT_COMMAS_MACRO, 
        BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))
#define PRINT_COMMAS_MACRO(z, n, data) ,

看效果

为了节省额外的宏,您可以利用BOOST_PP_ENUM在展开之间添加逗号的事实,通过在重复次数上添加1并使用BOOST_PP_TUPLE_EAT丢弃宏参数:

#define PRINT_COMMAS(...)
    BOOST_PP_ENUM( 
        BOOST_PP_INC(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)), 
        BOOST_PP_TUPLE_EAT(), 
        BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))

看效果