A program can register a callback function on a particular stream as follows:
// Callback function void show_event(std::ios_base::event e, std::iosbase& io, int index) { if (e == std::ios_base::imbue_event) std::cout << "imbue called" << std::endl; else if (e == std::ios_base::erase_event) std::cout << "stream destroyed" << std::endl; else std::cout << "cpyfmt called" << std::endl; } std::ostringstream s; s.register_callback(show_event,0); //1 s.imbue(std::locale::global()); //2
//1 | The function show_event is now called with either std::ios_base::erase_event, std::ios_base::imbue_event, or std::ios_base::copyfmt_event as the first argument, depending on whether the destruction of the stream, the imbuing of a new locale, or a call to std::basic_ios<>::copyfmt() initiated the callback. |
//2 | This causes show_event to be called. The first argument is std::ios_base::imbue_event; the second argument is a reference to the stream where the event occurred, which is s in this case; and the third argument is always the index provided in the call to std::ios_base<>::register_callback(), which is 0 in this case.
If more than one function is registered, functions are called in the opposite order of registration. |
Please refer to Section 26.9.2 for an example using callback functions with a user-defined stream inserter.