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

C++ Logging using std::ostream and std::cout

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

我知道 std::cout 是一个 std::ostream,不同之处在于 std::cout 将结果重定向到标准输出。

我希望我的 class 有一个 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
}

有没有和上面类似的方法呢?如果没有,我怎么能得到相似的结果?

谢谢。

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

#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(); 这样的日志语句很便宜。