Как переопределить функцию rdbuf() для clog, чтобы она соответствовала оригинальной функции rdbuf() для clog и файла журнала?
Кто-нибудь есть пример того, как переопределить встроенный в C++ C++, чтобы вместо этого иметь новый связанный rdbuf(), который обрабатывается, чтобы быть тройником к оригинальному clog.rdbuf() и rdbuf() объекта ofstream в журнал файл на диске.
Намерение состоит в том, чтобы код использовал std::clog повсюду, но чтобы он шел как к месту назначения по умолчанию, так и к файлу журнала на диске.
Благодарю.
-William
1 ответ
Вам нужно будет написать собственный класс, производный от streambuf. Пусть он выкладывает данные как в rdbuf вашего ofstream, так и в исходный rdbuf.
Общий пример написания пользовательского streambuf:
http://www.dreamincode.net/code/snippet2499.htm
Сохранение нового потокового буфера может быть сделано следующим образом:
// grab buffer for clog
std::streambuf* oldClogBuf = std::clog.rdbuf();
// create custom buffer which feeds both clog and an ofstream
CustomBuffer* customBuf = new CustomBuffer( oldClogBuf );
// stash custom buffer
std::clog.rdbuf( customBuf );
...do stuff...
// restore original clog buffer
std::clog.rdbuf( oldClogBuf );
Вы можете сделать все это более надежным, используя идиому RAII для управления переключением буфера.