首先是直接的问题:register_callback()
旨在处理存储在其中的资源的适当复制和释放,pword()
并且将仅进行与此相关的操作(即,复制、分配和释放以及观察std::locale
更改)。所以,不,这对你一点帮助都没有。
但是,您可以做的是创建一个过滤流缓冲区,该缓冲区观察是否有写入流,例如,如下所示:
class changedbuf: std::streambuf {
std::streambuf* d_sbuf;
bool d_changed;
int_type overflow(int_type c) {
if (!traits_type::eq_int_type(c, traits_type::eof())) {
this->d_changed = true;
}
return this->d_sbuf->sputc(c);
}
public:
changedbuf(std::streambuf* sbuf): d_sbuf(d_sbuf), d_changed() {}
bool changed() const { return this->d_changed; }
}
您可以使用它来代替std::ostream
您已经拥有的,例如:
void f(std::ostream& out) {
changedbuf changedbuf(out.rdbuf());
std::ostream changedout(&changedbuf);
// use changedout instead of out; if you need to use a global objects, you'd
// replace/restore the used stream buffer using the version of rdbuf() taking
// an argument
if (changedbuf.change()) {
std::cout << "there was a change\n";
}
}
一个真正的实现实际上会提供一个缓冲区并处理正确的刷新(即覆盖sync()
)和序列输出(即覆盖xsputn()
)。但是,上述版本足以作为概念验证。
其他人可能会建议使用std::ostringstream
. 根据写入的数据量,这很容易成为性能消耗,特别是与changedbuf
适当处理缓冲的高级版本相比。