Создание собственных манипуляторов без аргументов
Манипуляторов записи, которые не используют аргументы требуют ни наследования класса и использования сложных макросов. Предположим, что требуется пар <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 вставляет символы в поток. Функция вызывается, когда она представлена в поток, не обязательно при смежные символы напечатаны. Таким образом, введя может быть задерживается из-за буферизации потока.