pan*_*yte 7 c++ timestamp operator-overloading ostream
我想向 std::cout / std::cerr ostreams 的某些输出添加时间戳,而不使用修改后的标准流,如下所示:
std::cerr << timestamp << "Warning!\n";
Run Code Online (Sandbox Code Playgroud)
或者:
std::cerr << timestamp() << "Warning!\n";
Run Code Online (Sandbox Code Playgroud)
输出应如下所示:
[2020-01-23 17:40:15 CET] Warning!
Run Code Online (Sandbox Code Playgroud)
但我真的对我的想法并不满意:
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";
}
Run Code Online (Sandbox Code Playgroud)
所以我基本上定义了一个空类,使用全局声明并重载“<<”运算符。这感觉不对。像 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;
}
Run Code Online (Sandbox Code Playgroud)
在这里查看它的运行:https: //ideone.com/YRawuQ
小智 4
如果您只是在寻找一个独立的函数,这就是我从“像时间戳()这样的静态函数”中理解的,您可以将日期作为字符串返回:
std::string timeStamp(){
std::ostringstream strStream;
std::time_t t = std::time(nullptr);
strStream<< "[" << std::put_time(std::localtime(&t), "%F %T %Z") << "] ";
return strStream.str();
}
int main(){
std::cout<<timeStamp()<<" Testing!";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
记得包含流
| 归档时间: |
|
| 查看次数: |
2124 次 |
| 最近记录: |