我想在std :: cout / std :: cerr ostream的某些输出上添加时间戳,而无需使用经过修改的标准流,例如:
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";
}
所以我基本上是在定义一个空类,使用全局声明并重载'<
您的操作方式没有错。但是,如果您正在寻找替代方法,则可以创建一个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