我想定义一个具有可变数量参数的宏,它打印每个给定参数的名称和值。
例如:
MACRO(x)
会打印 x = 123
MACRO(x,y)
会打印 x,y = 123,666
更好的宏会更具可读性
BETTER_MACRO(x,y)
会打印 x = 123, y = 666
对于一个变量,我可以管理:
#define MACRO(...) cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << endl;
对于更多,它不起作用。
通过这种方式,我想到了一些辅助问题。
1) 如何获取给宏的变量个数? 2) 如何访问每个参数?
天真地猜测,我们可以回答这两个问题。
那么我们希望通过下面的方式来定义宏。
#define BETTER_MACRO(...) {for (int i=0;i<=nb_variables;i++) {cout << #var[i] << var[i];}}
最佳答案
#define MACRO(...) function(#__VA_ARGS__, __VA_ARGS__)
// base case for template recursion when one argument remains
template <typename Arg1>
void function(const char* name, Arg1&& arg1)
{
std::cout << name << " = " << arg1 << std::endl;
}
// recursive variadic template for multiple arguments
template <typename Arg1, typename... Args>
void function(const char* names, Arg1&& arg1, Args&&... args)
{
const char* comma = strchr(names + 1, ',');
std::cout.write(names, comma - names) << " = " << arg1;
function(comma, args...);
}
上面有一个有点古怪的特性,无论你在 MACRO 调用中包含(或不包含)的间距都将反射(reflect)在输出中。
关于c++ - 如何使用宏打印可变数量的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22964799/