现有宏在我的应用程序中获得可变数量的变量
我希望,使用此宏,以name=value
格式打印这些变量。
这是一个小例子:
#define EXISTING_MACRO(...) < ??? >
int main()
int a = 0;
int b = 1;
int c = 2;
EXISTING_MACRO(a,b,c);
输出应为:
a=0, b=1, c=2
我已经尝试通过从宏中调用可变参数模板函数来做到这一点,并且我确实成功打印了变量值,但不是变量名称。 (#x
打印他们的地址,即使它没有,也可能只显示方法变量名称'f'
):
#define SHOW(a) std::cout << #a << "=" << (a)
template<typename TF>
void write_err_output(std::ostream& out, TF const& f) {
out << f << std::endl;
}
template<typename TF, typename ... TR>
void write_err_output(std::ostream& out, TF const& f, TR const& ... rest) {
out << SHOW(f) << " ";
write_err_output(out, rest...);
}
答案 0 :(得分:6)
你可以通过一些黑客来做到这一点。黑客攻击不是很强大,但如果您将其用于调试目的,则应该可以接受。
我们的想法是对整个可变参数宏参数进行字符串化,然后通过逗号标记来区分标签序列。这要求所有可变参数都不包含逗号,如果它们都是变量名,那就是这种情况,但是没有办法要求它,实际上下面提出的代码将很乐意接受表达式,如图所示。
#define SHOW(...) show(std::cout, #__VA_ARGS__, __VA_ARGS__)
template<typename H1>
std::ostream& show(std::ostream& out, const char* label, H1&& value) {
return out << label << "=" << std::forward<H1>(value) << '\n';
}
template<typename H1, typename ...T>
std::ostream& show(std::ostream& out, const char* label, H1&& value, T&&... rest) {
const char* pcomma = strchr(label, ',');
return show(out.write(label, pcomma - label) << "="
<< std::forward<H1>(value)
<< ',',
pcomma + 1,
std::forward<T>(rest)...);
}
(住在coliru)
为简单起见,为避免std::string
,我使用了标准的C strchr
函数而不是C ++库函数。向任何被冒犯的人道歉。