gpt4 book ai didi

c++ - 将时间戳打印到 ostream 的最简单方法

转载 作者:行者123 更新时间:2023-12-05 00:09:48 29 4
gpt4 key购买 nike

我想为 std::cout/std::cerr ostreams 的某些输出添加时间戳,而不使用修改后的标准流,如下所示:

std::cerr << timestamp << "Warning!\n";

或者:
std::cerr << timestamp() << "Warning!\n";

输出应如下所示:
[2020-01-23 17:40:15 CET] Warning!

但我真的对我想出的东西不满意:
class TimeStamp {};

std::ostream &operator<<(std::ostream &stream, const TimeStamp &ts)
{
std::time_t t = std::time(nullptr);
stream << "[" << std::put_time(std::localtime(&t), "%F %T %Z") << "] ";
return stream;
}

TimeStamp ts;

int main()
{
std::cerr << ts << "Warning!\n";
std::cerr << ts << "Another warning!\n";
}

所以我基本上定义了一个空类,使用全局声明并重载“<<”运算符。这感觉不对。像 timestamp() 这样的静态函数可能更适合,但我不太确定如何继续。我在网上找到的所有示例都使用了重载的 '<<' 运算符,但这样做通常更有意义,因为输出了一些类状态。我可以在本地创建一个 ostream 并在函数中返回它吗?

最佳答案

你这样做的方式没有任何问题。但如果您正在寻找替代方案,您可以创建一个 ostream包装器:

class Logger {
private:
std::ostream &stream;

void print_time() {
std::time_t t = std::time(nullptr);
stream << "[" << std::put_time(std::localtime(&t), "%F %T %Z") << "] ";
}
public:
//Maybe also take options for how to log?
Logger(std::ostream &stream) : stream(stream) { }

template <typename T>
std::ostream &operator<<(const T &thing) {
print_time();
return stream << thing;
}
};

int main()
{
Logger log(std::cerr);
log << "Warning!" << std::endl;
log << "Another warning!" << std::endl;
}

在这里查看它运行: https://ideone.com/YRawuQ

关于c++ - 将时间戳打印到 ostream 的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59883881/

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