Поделиться через


Создание собственных манипуляторов без аргументов

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

См. также

Ссылки

Потоки вывода