使用 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();
这样的日志语句很便宜。
我想编写一个程序,让用户能够通过设置程序显示进度或禁用它来控制包的日志记录。
我知道 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();
这样的日志语句很便宜。