Я хотел бы создать потоковый класс, через который я могу писать в оба 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;
Можно ли это сделать?
Я нашел (или «то») решение!
Я добавил следующий код:
Log & operator << (Log & stream, std::ostream & (*f)(std::ostream&))
{
std::cout << f;
std::clog << f;
return stream;
}
Это добавляет функциональность для принятия, например, std::endl
(или другие вызовы функций внутри std::ostream
), который теперь ведет себя как ожидалось.
Обычно нет необходимости кодировать такую штуковину вручную, чтобы направить вывод в несколько мест.
использование тройник полезность для этого.