3

我正在寻找一种向 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

2 回答 2

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。

注意:哨兵是不同的东西,这不是你需要的。

于 2010-12-18T21:10:42.650 回答
0

或者,您可以为此使用邪恶的宏..

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

(是的,__FUNCTION__没有在任何地方定义,但是嘿......)负面的是你必须使用宏来包装,正面的是它只为所有链式流操作插入一次名称(在流缓冲区的情况下,它'将为所有新行添加一个前缀 [当然,除非那是您想要的!])

于 2010-12-18T21:25:34.893 回答