1

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

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

但这会产生一系列错误,因为逗号被扩展并且宏认为它们正在划分参数。

有没有办法解决这个问题?

4

1 回答 1

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在扩展之间添加逗号的事实,方法是在重复次数上加一并使用以下方法丢弃宏参数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__))

看它工作

我个人认为第一个更清楚。

于 2014-07-16T00:52:22.023 回答