【发布时间】:2020-12-29 20:50:41
【问题描述】:
由于我不想在这里重复代码,我试图找出一种方法将每个记录器函数(例如调试、警告、信息等)的公共部分移动到另一个函数中.
我自己尝试过一种天真的方法,但似乎不能正常工作。我想我需要直接传递va_list,但这样做我不知道是否值得一开始就创建一个单独的函数。关于如何实现这一目标的任何想法/建议?
原创
void ConsoleLogger::debug(const char *fmt...)
{
if (static_cast<uint8_t>(LogLevel::DEBUG) <= static_cast<uint8_t>(configuration.priority))
{
va_list args;
char log_text[LOG_MAX_LENGTH];
va_start(args, fmt);
vsnprintf(log_text, LOG_MAX_LENGTH, fmt, args);
va_end(args);
std::cout << get_time_as_string() + " [DEBUG] " + log_text + "\n";
std::cout.flush();
}
}
我的镜头没有按预期工作,因为 log_text 填充了错误/随机字符,而在原始文件中它打印了正确的字符串。
const std::string Logger::get_log_text(const char *fmt...) const
{
va_list args;
char log_text[LOG_MAX_LENGTH];
va_start(args, fmt);
vsnprintf(log_text, LOG_MAX_LENGTH, fmt, args);
va_end(args);
return std::string(log_text);
}
void ConsoleLogger::debug(const char *fmt...)
{
if (static_cast<uint8_t>(LogLevel::DEBUG) <= static_cast<uint8_t>(configuration.priority))
{
std::string log_text = get_log_text(fmt);
std::cout << get_time_as_string() + " [DEBUG] " + log_text + "\n";
std::cout.flush();
}
}
【问题讨论】:
-
FWIW,您应该考虑使用 variadic templates 而不是老式的 C 变量函数。它们在类型系统上的表现要好得多,而且我发现它们更易于使用。
-
...它们甚至可以被转发!
-
什么不能按预期工作?期望什么?你的问题我不清楚。
-
@Barnercart 这个问题被骗了。请参阅此处以获取答案:stackoverflow.com/questions/150543/…
-
我正在运行不同的 Logger 实现,如 ConsoleLogger、FileLogger 等,它们都使这些日志记录功能过载。这是否可以通过 viariadic 模板函数实现?基类有那些虚拟的,据我所知,C++ 目前不允许虚拟模板成员函数。