我正在寻找一种向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
答案 0 :(得分: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);
您可以在网上找到很多关于如何实现流缓冲区的示例。 还要确保您的代码是异常安全的,即使抛出异常也会恢复oldBuf。
注意:哨兵是不同的,这不是你需要的。
答案 1 :(得分:0)
或者,你可以使用一个邪恶的宏..
#define f_str(str) str << __FUNCTION__ << ' '
(是的,__FUNCTION__
没有在任何地方定义,但是嘿......)否定的是你必须使用宏来包装,肯定的是它只为所有链式流操作插入一次名称(在流缓冲区的情况下,它将为所有新行添加前缀[除非你想要的当然!]