gpt4 book ai didi

c++ - 如何简化这些可变函数?

转载 作者:行者123 更新时间:2023-11-28 02:47:30 25 4
gpt4 key购买 nike

我写了一个 Logger 类来将信息转储到文件中。以下代码是 Logger 的缩影。功能看起来差不多。。。但是我不知道如何简化它。你能让它更优雅吗?

My earlier version使用varadic宏来实现这个目标。后来发现文件指针和缩进级别这两个数据可以封装成一个类,这样就不用每次都传(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);
}

最佳答案

就像您不将您的参数转发给可变参数 fprintf 一样,但是 vfprintf,您会在您的情况下做同样的事情。

void Xml_Logger::master_print(bool indent, bool newline, const char* format, va_list& args) const
{
if (indent) print_indent();
vfprintf(fp, format, args);
if (newline) fputc('\n', fp);
}

void Xml_Logger::print(const char *format, ...) const
{
va_list args;
va_start(args, format);
master_print(true, false, format, args);
va_end(args);
}

void Xml_Logger::println(const char *format, ...) const
{
va_list args;
va_start(args, format);
master_printf(true, true, format, args);
va_end(args);
}

但不幸的是,这需要在每个包装器中重复 va_list 内容。所以如果你有 C++11,尝试使用 a template with perfect forwarding

关于c++ - 如何简化这些可变函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23956548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com