Escrever seus próprio Manipulators sem argumentos
Gravação de manipulators que não usam argumentos requer nem derivação da classe nem o uso de macros complexos.Suponha que sua impressora requer o par <ESC> [para entrar no modo de negrito.Você pode inserir esse par diretamente no fluxo:
cout << "regular " << '\033' << '[' << "boldface" << endl;
Ou você pode definir a bold manipulator, que insere os caracteres:
ostream& bold( ostream& os ) {
return os << '\033' << '[';
}
cout << "regular " << bold << "boldface" << endl;
Definido globalmente bold funciona leva um ostream de referência argumento e retorna o ostream referência.Não é uma função de membro ou um amigo porque ele não precisa de acesso a quaisquer elementos de classe privada.O bold função se conecta ao fluxo porque o fluxo << operador sobrecarregado para aceitar esse tipo de função, usando uma declaração parecida com isto:
_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
{
// call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
Você pode usar esse recurso para estender outros operadores sobrecarregados.Nesse caso, ele é incidental que bold insere caracteres no fluxo.A função é chamada quando ela for inserida no fluxo, não necessariamente quando os caracteres adjacentes são impressos.Assim, a impressão pode ser atrasada devido o fluxo de buffer.