自行编写无自变量的操控器
编写不使用参数的操控器既不需要类派生,也不需要使用复杂宏。 假设你的打印机需要使用对 <ESC>[ 才能进入粗体模式。 可直接将此对插入到流中:
cout << "regular " << '\033' << '[' << "boldface" << endl;
或者,可定义 bold
操控器,这样可插入字符:
ostream& bold(ostream& os) {
return os << '\033' << '[';
}
cout << "regular " << bold << "boldface" << endl;
全局定义的 bold
函数将采用 ostream
引用参数并返回 ostream
引用。 因为它不需要访问任何私有类元素,所以它不是成员函数或友元。 bold
函数将连接到流,因为此流的 <<
运算符将重载以接受该函数类型,其中使用的声明如下所示:
_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
{
// call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
可使用此功能扩展其他重载运算符。 在这种情况下,bold
可能会将字符插入到流中。 函数插入到流中时,将调用此函数,而打印相邻字符时则无需调用函数。 因此,由于流的缓冲,打印可能会延迟。