Scrittura di manipolatori personalizzati senza gli argomenti
La scrittura di manipolatori che non usano argomenti non richiede né la derivazione di classi né l'uso di macro complesse. Si supponga che la stampante richieda la coppia <ESC>[ per attivare la modalità grassetto. È possibile inserire la coppia direttamente nel flusso:
cout << "regular " << '\033' << '[' << "boldface" << endl;
In alternativa, è possibile definire il manipolatore bold
che inserisce i caratteri:
ostream& bold(ostream& os) {
return os << '\033' << '[';
}
cout << "regular " << bold << "boldface" << endl;
La funzione bold
definita a livello globale accetta un argomento di riferimento ostream
che restituisce il riferimento ostream
. Non è una funzione membro o un amico perché non richiede l'accesso ad alcun elemento della classe privata. La funzione bold
si connette al flusso perché l'operatore <<
del flusso è sottoposto a overload per accettare tale tipo di funzione. Viene usata una dichiarazione simile alla seguente:
_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
{
// call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
È possibile usare questa funzionalità per estendere altri operatori di overload. In questo caso, è un'operazione accidentale che bold
inserisce caratteri nel flusso. La funzione viene chiamata quando viene inserita nel flusso, non necessariamente quando vengono stampati i caratteri adiacenti. Di conseguenza, la stampa potrebbe essere ritardata a causa del buffer del flusso.
Vedi anche
Output Streams (Flussi di output)