一是直接的問題: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
相比。
它可以是任何ostream實現 - 這是重點 – gsf