Share via


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)