C++ запись в std::out и std:clog одновременно

Я хотел бы создать потоковый класс, через который я могу писать в оба std::out а также std::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;

Можно ли это сделать?

2 ответа

Я нашел (или "то") решение!

Я добавил следующий код:

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

Это добавляет функциональность, чтобы также принять, например, std::endl (или другие вызовы функций внутри std::ostream), который теперь ведет себя как ожидалось.

Обычно нет необходимости кодировать такое устройство вручную, чтобы направить вывод в несколько мест.

Используйте утилиту для этого.

Другие вопросы по тегам