Добавить префиксы к выходным данным

Я ищу способ добавить префикс в 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__ не везде определяется, но эй...) Отрицательным является то, что вам нужно использовать макрос для переноса, положительным является то, что он вставляет имя только один раз для всех операций цепочки потоков (в случае буфера потока он будет иметь префикс для всех новых строк [если это не то, что вы хотите, конечно!])

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