C++同时写入 std::out 和 std:clog

C++ writing to std::out and std:clog simultaneously

本文关键字:std out clog C++      更新时间:2023-10-16

我想创建一个类似流的类,通过它我可以写入std::outstd::clog

我有以下代码,但问题是它只写入std::clog,而控制台上的输出不符合预期(奇怪的是,它会覆盖自己)。

struct Log : public std::ofstream
{
    Log(const std::string filename)
    : std::ofstream(filename.c_str())
    {
        std::clog.rdbuf(this->rdbuf());
    }
};
template <typename T>
Log & operator << (Log & stream, const T & x)
{
    std::cout << x;
    std::clog << x;
    return stream;
};

我想要的是这个

Log log("logfile.txt");
log << "this should go to the console and the logfile" << 1234 << std::endl;

这能做到吗?

我找到了一个(或"the")解决方案!

我添加了以下代码:

Log & operator << (Log & stream, std::ostream & (*f)(std::ostream&))
{
    std::cout << f;
    std::clog << f;
    return stream;
}

这增加了功能以接受例如 std::endl(或 std::ostream 中的其他函数调用),现在的行为符合预期。

通常不需要手动编写这样的装置来将输出定向到多个位置。

为此使用三通实用程序。