Heim >Backend-Entwicklung >C++ >Wie gehe ich mit „std::endl' beim Überladen von benutzerdefinierten Stream-Operatoren um?
Operatorüberladung und Handhabung std::endl in benutzerdefinierten Stream-Implementierungen
Betrachten Sie den folgenden Codeausschnitt, in dem Operator<< ist überlastet:
template <typename T> UIStream& operator<< (const T); UIStream my_stream; my_stream << 10 << " heads";
Dies funktioniert zwar wie erwartet, aber der Versuch, my_stream << endl führt zu einem Kompilierungsfehler mit der Meldung „Binär ‚<<‘“ : Es wurde kein Operator gefunden, der einen linken Operanden vom Typ „UIStream“ annimmt ...“
Um dieses Problem zu beheben, ist es wichtig zu verstehen, dass std::endl kein Objekt, sondern eine Funktion ist. In std::cout wird es durch die Implementierung des Operators << verwendet. um einen Funktionszeiger mit derselben Signatur wie std::endl zu akzeptieren. Beim Aufruf wird die Funktion aufgerufen und ihr Rückgabewert weitergeleitet.
Eine benutzerdefinierte Implementierung des Operators<< kann so definiert werden, dass std::endl auf ähnliche Weise behandelt wird:
struct MyStream { templateMyStream& operator<< (const T& x) { std::cout << x; return *this; } // Function that takes a custom stream and returns it typedef MyStream& (*MyStreamManipulator)(MyStream&); // Accept function with custom signature MyStream& operator<< (MyStreamManipulator manip) { return manip(*this); } // Define a custom endl for this stream (matches MyStreamManipulator signature) static MyStream& endl(MyStream& stream) { std::cout << std::endl; stream << "Called MyStream::endl!" << std::endl; return stream; } }; Diese benutzerdefinierte Implementierung definiert einen Operator<< das akzeptiert zwei Typen:
- Der erste Typ ist ein generischer Funktionszeiger, der einen Verweis auf das MyStream-Objekt entgegennimmt und einen Verweis auf dasselbe Objekt zurückgibt.
- Der zweite Typ ist ein Funktionszeiger, der speziell einen Verweis auf ein MyStream-Objekt entgegennimmt und einen Verweis auf dasselbe Objekt zurückgibt.
Dies ermöglicht die Implementierung einer benutzerdefinierten Endl-Funktion, die darauf ausgeführt wird der benutzerdefinierte Stream.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit „std::endl' beim Überladen von benutzerdefinierten Stream-Operatoren um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!