2010-12-18 3 views
2

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

ответ

4

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

Вы можете найти множество примеров в сети о том, как реализовать потоковые буферы. Также убедитесь, что ваш код является безопасным исключением, то есть restore oldBuf, даже если выбрано исключение.

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

+0

Я знаю о streambufs, и это была моя оригинальная идея, я просто задавался вопросом, почему часовой документирован так, если он не делает этого. –

+1

@Arkaitz: «префикс», который упоминается, есть префикс функции, которая читает/записывает в поток. Они предназначены для проверки состояния потока и исключения, когда поток находится в плохом состоянии. – ybungalobill

+0

круто, теперь это имеет смысл, его просто то, что операции префикса и суффикса в потоковом контексте выглядели слишком много, как я хотел, я думаю, что я привязан к реализации streambuf. –

0

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

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

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