需要帮助将可变宏扩展为字符串化名称和值序列

Need help expanding a variadic macro to a sequence of stringified names and values

本文关键字:字符串 帮助 扩展      更新时间:2023-10-16

我知道在C++中,我可以使用#指令获得宏参数的名称,如下所示:

#define FOO(value) #value

我想弄清楚的是如何将参数列表转换为一个更长的列表,其中也包括字符串名称。给定FOO(a, b, a+b),我想得到"a", a, "b", b, "a+b", a+b

我可以通过为多达N个参数的潜在序列创建N个宏来做到这一点,但有没有一种方法可以用可变宏来写这一点?

是的,您可以使用BOOST_PP_ENUM迭代可变数据,并在每个扩展之间添加逗号:

#define FOO(...)                                
    BOOST_PP_ENUM(                              
        BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),    
        MACRO,                                  
        BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__) 
    )
#define MACRO(z, n, data) 
    BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(n, data)), BOOST_PP_TUPLE_ELEM(n, data)
FOO(a, b, a+b) //"a", a , "b", b , "a+b", a+b

ENUM获取迭代次数、宏和要提供给宏的数据。我们传递一个包含可变数据的PP元组。然后,宏访问索引为n的元素。你可以在这里看到这幅作品。