Écrire vos propres manipulateurs sans arguments
L’écriture de manipulateurs qui n’utilisent pas d’arguments ne nécessite ni dérivation de classe ni utilisation de macros complexes. Supposons que votre imprimante nécessite la paire <ÉCHAP>[ pour entrer en mode gras. Vous pouvez insérer cette paire directement dans le flux :
cout << "regular " << '\033' << '[' << "boldface" << endl;
Ou vous pouvez définir le manipulateur bold
, qui insère les caractères :
ostream& bold(ostream& os) {
return os << '\033' << '[';
}
cout << "regular " << bold << "boldface" << endl;
La fonction bold
définie globalement accepte un argument de référence ostream
et retourne la référence ostream
. Il ne s’agit pas d’une fonction membre ou d’un ami, car il n’a pas besoin d’accéder à des éléments de classe privée. La fonction bold
se connecte au flux car l’opérateur <<
du flux est surchargé pour accepter ce type de fonction, utilisant une déclaration qui ressemble quelque peu à ceci :
_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
{
// call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
Vous pouvez utiliser cette fonctionnalité pour étendre d’autres opérateurs surchargés. Dans ce cas, il est accessoire d’insérer bold
des caractères dans le flux. La fonction est appelée lorsqu’elle est insérée dans le flux, pas nécessairement lorsque les caractères adjacents sont imprimés. Par conséquent, l’impression peut être retardée en raison de la mise en mémoire tampon du flux.