【发布时间】:2014-07-20 07:53:23
【问题描述】:
我写了一个Logger 类来将信息转储到文件中。下面的代码是Logger的缩影。功能看起来几乎一样......但我不知道如何简化它。你能让它更优雅吗?
My earlier version 使用可变参数宏来实现这一目标。后来我注意到文件指针和缩进级别这两个数据可以封装成一个类,这样我就不需要每次都传递(FILE *fp, size_t indent)。 (Xml_Logger &logger) 就够了。
所以我希望我可以只使用成员函数,否则就像我在回滚......
void ind_print(const char *format, ...) {
print_indent();
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
void ind_println(const char *format, ...) {
print_indent();
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
printf("\n");
}
void print(const char *format, ...) {
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
void println(const char *format, ...) {
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
printf("\n");
}
更新:看看这两个函数。我希望println 可以调用print,但不幸的是它不能。不是吗?
void Xml_Logger::print(const char *format, ...) const {
print_indent();
va_list args;
va_start(args, format);
vfprintf(fp, format, args);
va_end(args);
}
void Xml_Logger::println(const char *format, ...) const {
print_indent();
va_list args;
va_start(args, format);
vfprintf(fp, format, args);
va_end(args);
fputc('\n', fp);
}
【问题讨论】:
-
我最近问了一个类似的问题,top voted answer 几乎就是你所做的。
-
我的建议是避免使用宏,因为它只会增加混淆。
-
@Vorac 我不认为这是一个类似的问题...您希望在更改基础功能时尽量减少修改,但我想删除代码的冗余。
-
使用 putchar/putc/fputc 而不是 printf 来写一个换行符
-
@WilliamPursell 我也是。每当宏出现时,人们就会批评它。所以我问的是宏以外的建议(我可以想出)。
标签: c++ variadic variadic-functions