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

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 并在函数中返回它吗?

sco*_*001 5

你的做法并没有什么问题。但如果您正在寻找替代方案,您可以创建一个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)

记得包含流