gpt4 book ai didi

c++ - 使用 boost::format 的 C++ 便捷日志记录语句

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:47 24 4
gpt4 key购买 nike

我想设计一个具有以下特点的日志功能:

  • 基于 std::string 而不是 char*
  • 支持可变数量的变量,如printf
  • 接受严重级别作为第一个参数
  • 避免严重级别低于日志记录级别时的格式化开销
  • 与 printf 一样简单,或几乎如此

我倾向于使用 boost::format,因为它具有自动类型转换功能。但这里有一些我看到的问题:

它的语法有点尴尬:format("Mgr %s on pid %d is in state %s"% mgr % pid % s) 有点难看(列表没有逗号,变量的性质就不那么明显了)。日志调用如下所示:

mylog(INFO, format("Mgr %s on pid %d is in state %s" % mgr % pid % s));

更糟糕的是,是否有可能实现 mylog() 来检查我们是否在构造格式对象之前记录 INFO 消息?

我想到的另一种方法,看起来更接近 printf,是

mylog(INFO, "Mgr %s on pid %d is in state %s", mgr, pid, s);

甚至

mylog_info("Mgr %s on pid %d is in state %s", mgr, pid, s);

实现会是这样的:

mylog(int severity, string pattern, ...) {
if (severity >= LOGLEVEL) {
boost::format fmt(pattern);
for parm /* remaining parameters */ {
fmt % parm; // feed into format one at a time
}
}
}

这肯定会推迟构建format 对象,直到需要它为止。但据我所知,在遍历可变参数列表时,无法判断何时到达末尾!

有人可以建议一种语法上简单的技术来完成这个吗?

注意:我有 g++ 4.4,它不支持所有的 c++11(尽管它支持可变参数模板)

最佳答案

您可以使用可变模板和递归。

Note: Since you mention GCC 4.4, this feature is available for that compiler, but it is not enabled by default. You have to add either the -std=c++0x or -std=gnu++0x option to the compiler to enable the feature.

可以按照以下方式实现解决方案:

// Does the actual logging of the formatted message
void mylog_r (int severity, boost::format &fmt) {
std::cout << "[" << severity << "] "
<< fmt
<< std::endl;
}

// Unpacks the variadic arguments one at a time recursively
template <typename T, typename... Params>
void mylog_r (int severity, boost::format &fmt, T arg, Params... parameters) {
mylog_r(severity, fmt % arg, parameters...); // recursively unpack
}

// This version of mylog() checks severity and converts fmt to boost::format
template <typename... Params>
void mylog (int severity, std::string fmt, Params... parameters) {
if (severity < LEVEL) return;
boost::format bfmt(fmt);
mylog_r(severity, bfmt, parameters...);
}

关于c++ - 使用 boost::format 的 C++ 便捷日志记录语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18347957/

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