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

问题描述 投票:0回答:1

我想在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";
}

所以我基本上是在定义一个空类,使用全局声明并重载'<

c++ timestamp operator-overloading ostream
1个回答
0
投票

您的操作方式没有错。但是,如果您正在寻找替代方法,则可以创建一个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

© www.soinside.com 2019 - 2024. All rights reserved.