Добавить префиксы к выходным данным
Я ищу способ добавить префикс в ostream, передать его другим функциям, чтобы их выходы имели префикс, а затем удалить его, чтобы продолжить.
Проверьте следующий псевдокод:
...
void function(ostream &out){
out << "output 1\n";
out << "output 2\n";
}
cout << "Whatever\n";
add_suffix(cout,"function: ");
function(cout);
remove_suffix(cout);
...
С выводом вроде:
...
Whatever
function: output 1
function: output 2
...
Глядя на документы ostream, они утверждают, что часовой может быть использован для префикса / суффикса, но я не знаю, как это сделать, если я хочу использовать по назначению.
ostream::sentry
Документация гласит:
sentry: Perform exception safe prefix/suffix operations
2 ответа
Общий путь выглядит так: Определить YourStreamBuffer
это streambuf
который вставляет ваш префикс после любой новой строки, которая записывается в него, и отправляет вывод в буфер назначения. Тогда используйте это так:
streambuf *oldBuf = cout.rdbuf();
YourStreamBuffer yourBuf(oldBuf, "function: ");
// everything written to yourBuf is sent to oldBuf
cout.rdbuf(&yourBuf);
function(cout);
cout.rdbuf(oldBuf);
Вы можете найти множество примеров в сети о том, как реализовать ваши потоковые буферы. Также убедитесь, что ваш код безопасен для исключений, то есть восстанавливайте oldBuf, даже если выдается исключение.
Примечание: часовые это что-то другое, это не то, что вам нужно здесь.
В качестве альтернативы, вы можете использовать злой макрос для этого..
#define f_str(str) str << __FUNCTION__ << ' '
(да, __FUNCTION__
не везде определяется, но эй...) Отрицательным является то, что вам нужно использовать макрос для переноса, положительным является то, что он вставляет имя только один раз для всех операций цепочки потоков (в случае буфера потока он будет иметь префикс для всех новых строк [если это не то, что вы хотите, конечно!])