Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向ostream输出添加前缀_C++_Gcc_Iostream_Apache Sentry - Fatal编程技术网

C++ 向ostream输出添加前缀

C++ 向ostream输出添加前缀,c++,gcc,iostream,apache-sentry,C++,Gcc,Iostream,Apache Sentry,我正在寻找一种向ostream添加前缀的方法,将其传递给其他函数,以便它们的输出带有前缀,然后将其删除以继续 检查以下伪代码: ... void function(ostream &out){ out << "output 1\n"; out << "output 2\n"; } cout << "Whatever\n"; add_suffix(cout,"function: "); function(cout); remove_su

我正在寻找一种向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);
...
查看ostream的文档,他们声明sentry可能用于前缀/后缀,但如果预期用途是我想要的,我不知道如何做

ostream::sentry
文档说明:

sentry: Perform exception safe prefix/suffix operations

一般的方法是这样的:定义
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__ << ' '

#define f#u str(str)str我知道streambufs,这是我最初的想法,我只是想知道,如果哨兵不做这样的事情,为什么它会被记录成这样。@Arkaitz:“prefix”前面提到过,有一个函数的前缀可以读取/写入流。它们用于检查流的状态,并在流处于坏状态时抛出异常。很酷,现在它是有意义的,只是流上下文上的前缀和后缀操作看起来太像我想要的,我想我当时与streambuf实现有关。
#define f_str(str) str << __FUNCTION__ << ' '