使用 std::ostream 和 std::cout 的 C++ 日志记录

每个人

我想编写一个程序并使用户能够通过将程序设置为显示进度或禁用它来控制包的日志记录。

我知道这std::cout是一个std::ostream与差别std::cout重定向结果到标准输出。

我希望我的班级有一个std::ostream成员,我将所有内容都记录到其中。然后,如果用户启用显示,则该成员将附加到std::cout并显示结果,否则不会。

我想到的是类似的东西:

class log {
private:
    std::ostream display;
public:
    void func();
    void show_display();
}

void log::func(){
    display << "called by func";
}
void log::show_display(){
    // redirect display to standard output
}

有没有类似于上面的方法来做到这一点?如果没有,我怎么能得到类似的结果?

谢谢。

克雷克SB

流句柄不是可复制的对象,也没有任何std::ostream用户可以实例化的对象。所以你写的课不能工作。你可以做的是存储一个指针:

#include <iostream>

class log {
  std::ostream* out_;

public:
  void func() {
    if (out) { *out << "called by func"; }
    // ...
  }

  void show_display() {
    out = &std::cout;
  }

  void hide_display() {
    out = nullptr;
  }
};

如果您打算构建一个更通用的日志系统,您应该考虑是否将日志记录到禁用的输出需要对操作数进行评估;log << expensive_function();当禁用日志记录时,用户可能会期望诸如此类的日志语句便宜。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章