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.