2010-12-11 10 views
1

Ich hatte mehrere Fragen zum Thema Streams und Sachen, aber nachdem ich ein wenig nachgedacht habe, bin ich zu dem Schluss gekommen, dass alles, was ich brauche, eine benutzerdefinierte Flush-Typ ist. Ich möchte, dass mein Stream bei einer neuen Zeile gespült wird. Es erspart die Eingabe von std :: endl. Ist es möglich, dies zu implementieren? Ich verwende einen Ostream mit einem benutzerdefinierten Stringbuf.Benutzerdefinierte Stream-Flush-Typ

+0

Entschuldigung, aber warum ist das Schreiben von 'endl' ein paar Mal schwieriger als das Schreiben eines neuen Streams von (fast) Scratch? –

+0

Es ist nicht so viel wie es aus Interesse daran möglich ist und wenn ja, wie. – Jookia

Antwort

1

Ich glaube, dass alle es dauern würde, ostream::put(char) überschreibt, aber zitieren Sie mich nicht an, dass:

template <typename Ch> 
class autoflush_ostream : public basic_ostream<Ch> { 
public: 
    typedef basic_ostream<Ch> Base; 
    autoflush_ostream& put(Ch c); 
}; 

template <typename Ch> 
autoflush_ostream<Ch>& autoflush_ostream<Ch>::put(Ch c) { 
    Base::put(c); 
    if (c == "\n") { 
     flush(); 
    } 
    return *this; 
} 

Sie können jede Methode und Funktion außer Kraft setzen müssen, die ein Zeichen oder eine Folge von Zeichen nimmt, die in definiert ist die STL. Sie würden im Grunde alle dasselbe tun: Rufen Sie die für die Superklasse definierte Methode/Funktion auf, prüfen Sie, ob eine neue Zeile gerade gedruckt wurde, und leeren Sie sie, falls dies der Fall ist.

+0

basic_ostream :: put ist nicht virtuell, daher wird die Version der abgeleiteten Klasse nicht verwendet, es sei denn, der statische Typ des Objekts ist autoflush_ostream (d. H. Ein autoflush_ostream-Objekt, eine Referenz oder ein Zeiger). Insbesondere bedeutet dies, dass 'stream << '\ n'' deinen Put nicht aufrufen kann. –

+0

Bringen Sie mir bei, Programmieren über Schlaf zu wählen. – outis