Добавить префиксы к выходным данным - PullRequest
2 голосов
/ 19 декабря 2010

Я ищу способ добавить префикс в 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 ]

4 голосов
/ 19 декабря 2010

Общий путь выглядит следующим образом: Определите 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, даже если выбрасывается исключение.

Примечание: часовые - это нечто иное, здесь вам не нужно.

0 голосов
/ 19 декабря 2010

В качестве альтернативы, вы можете использовать злой макрос для этого ..

#define f_str(str) str << __FUNCTION__ << ' '

(да, __FUNCTION__ не везде определено, но эй ...) Отрицательно то, что вы должны использовать макрос для переноса, положительным является то, что он вставляет имя только один раз для всех операций цепочки потоков ( регистр потокового буфера, он будет иметь префикс для всех новых строк [если, конечно, это не то, что вам нужно!])

...