如何使用Boost预处理器打印出一个逗号多次(How do I print out a comma

2019-10-20 11:46发布

我需要使用可变参数宏扩展到一类的多种变化。 因为他们需要根据宏观输入我不能简单地使用模板来有不同的名称。 问题是,我无法展开逗号( , )符号,和我的类有服用多种参数(这是我需要使用逗号符号)功能。

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())\

但是,这产生了一系列的错误,因为逗号扩大和宏认为他们分裂参数。

有没有解决这个问题的任何方式?

Answer 1:

使用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__))

看看行不行

我个人认为首先是更加清晰。



文章来源: How do I print out a comma multiple times using Boost Preprocessor