Partager via


É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.

Voir aussi

Flux de sortie