创建variadic宏/方法,打印所有变量名称和值

时间:2015-08-26 12:11:14

标签: c++ macros variadic-templates variadic-macros

现有宏在我的应用程序中获得可变数量的变量 我希望,使用此宏,以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...);
}

1 个答案:

答案 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 ++库函数。向任何被冒犯的人道歉。