每次调用std :: cout时打印时间

3 c++

有人会这样做吗?例如我喜欢:

std::cout << "something";
Run Code Online (Sandbox Code Playgroud)

然后它应该打印"东西"之前的时间

Kos*_*Kos 6

为此创建自己的流:)这应该工作:

class TimedStream {
public:
    template<typename T>
    TimedStream& operator<<(const T& t) {
        std::cout << getSomeFormattedTimeAsString() << t << std::endl;
        return *this;
    }
};

TimedStream timed_cout;

void func() {
    timed_cout << "123";
}
Run Code Online (Sandbox Code Playgroud)

您可以将此类用于std::cout << obj可以完成的每种类型,因此无需进一步的工作.

但请注意,时间将在每次之前写出<<,因此您不能轻易地将它们链接起来.具有显式时间戳的另一种解决方案是:

class TimestampDummy {} timestamp;

ostream& operator<<(ostream& o, TimestampDummy& t) {
    o << yourFancyFormattedTimestamp();
}

void func() {
    cout << timestamp << "123 " << 456 << endl;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想能够链接东西,为什么不只是让TimedStream的运算符<<返回一个std :: ostream&并返回std :: cout?然后timed_cout << x << y绑定为(timed_cout << x)<< y,就像做timed_cout << x后跟std :: cout << y. (2认同)

sth*_*sth 5

您可以使用一个简单的函数来打印时间戳,然后返回流以进行进一步打印:

std::ostream& tcout() {
  // Todo: get a timestamp in the desired format
  return std::cout << timestamp << ": ";
}
Run Code Online (Sandbox Code Playgroud)

然后std::cout,无论何时要插入时间戳,都可以调用此函数而不是直接使用:

tcout() << "Hello" << std::endl;
Run Code Online (Sandbox Code Playgroud)