gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:25:43 27 4
gpt4 key购买 nike

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

我知道 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您的用户可以实例化的对象。所以你写的课是行不通的。你可以做的是存储一个指针:

#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::ostream 和 std::cout 进行 C++ 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43837221/

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