public member function
<<ios> <iostream>

std::ios_base::register_callback

void register_callback (event_callback fn, int index);
注册事件回调函数
fn 注册为回调函数,当发生流事件时,将使用 index 作为参数自动调用它。

如果有多个回调函数被注册,它们都会被调用,调用的顺序与注册时的顺序相反。

回调函数必须是可转换为 event_callback 的类型。并且它由一个等价于以下表达式的语句调用:

1
(*fn)(ev,stream,index)

其中 index 是使用此函数注册回调函数时传递的 index 参数,stream 是发生事件的流对象的指针,而 ev 是成员枚举类型 event 的对象,指示发生了哪个事件。它可以是以下成员值之一:

成员常量事件触发
copyfmt_event在调用成员函数 copyfmt 时(在所有格式标志已被复制,但在异常掩码被复制之前)。
erase_event在调用流析构函数时(在 basic_ios::copyfmt 的开头也调用)。
imbue_event在调用 imbue 时(在函数返回之前)。

在上述所有情况下,所有已注册的函数都会被调用。函数本身可以使用 ev 参数来区分触发函数调用的事件。

参数

fn
要调用的函数的指针。
event_callback 成员类型定义如下:

1
typedef void (*event_callback) (event ev, ios_base& ios, int index);
index
作为参数传递给回调函数的整数值。

返回值



示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// stream callbacks
#include <iostream>     // std::cout, std::ios_base
#include <fstream>      // ofstream

void testfn (std::ios::event ev, std::ios_base& stream, int index)
{
  switch (ev)
  {
    case stream.copyfmt_event:
      std::cout << "copyfmt_event\n"; break;
    case stream.imbue_event:
      std::cout << "imbue_event\n"; break;
    case stream.erase_event:
      std::cout << "erase_event\n"; break;
  }
}

int main () {
  std::ofstream filestr;
  filestr.register_callback (testfn,0);
  filestr.imbue (std::cout.getloc());
  return 0;
}

输出
imbue_event
erase_event


数据竞争

修改流对象。
并发访问同一个流对象可能导致数据争用。

异常安全

基本保证:如果抛出异常,流处于有效状态。

另见