Überlastung des Operators<< mit benutzerdefinierter Endl-Handhabung
Bei Überlastung des Bedieners<< -Operator kann es zu Kompilierungsfehlern kommen, wenn Sie versuchen, std::endl zu verwenden. Dieser Fehler tritt auf, weil der Compiler keinen geeigneten Operator << finden kann. Implementierung zur Verarbeitung des Typs std::endl.
Um dieses Problem zu lösen, muss man verstehen, dass std::endl kein Objekt, sondern eine Funktion ist. Um dies zu berücksichtigen, verfügt std::cout über einen eigenen Operator<< Überladung, die speziell einen Funktionszeiger mit derselben Signatur wie std::endl akzeptiert. Beim Aufruf ruft diese Überladung die Funktion auf und gibt den Rückgabewert weiter.
Um benutzerdefinierten Streams die Verarbeitung von std::endl zu ermöglichen, ist ein ähnlicher Ansatz erforderlich. Hier ist ein Beispielcode, der dies demonstriert:
#includestruct MyStream { template MyStream& operator<<(const T& x) { std::cout << x; return *this; } // Function that takes a custom stream and returns it typedef MyStream& (*MyStreamManipulator)(MyStream&); // Overload to accept functions with custom signature MyStream& operator<<(MyStreamManipulator manip) { return manip(*this); } // Custom `endl` implementation for this stream static MyStream& endl(MyStream& stream) { std::cout << std::endl; stream << "Called MyStream::endl!" << std::endl; return stream; } // Type of std::cout typedef std::basic_ostream > CoutType; // Function signature of std::endl typedef CoutType& (*StandardEndLine)(CoutType&); // Overload to accept std::endl MyStream& operator<<(StandardEndLine manip) { manip(std::cout); return *this; } }; int main() { MyStream stream; stream << 10 << " faces." << MyStream::endl << std::endl; return 0; } In diesem Code haben wir:
- Überladener Operator<< damit MyStream generische Typen und Funktionen mit einer benutzerdefinierten Signatur verarbeiten kann.
- Eine benutzerdefinierte Endl-Funktion definiert, die eine neue Zeile und zusätzliche Informationen druckt.
- Überladener Operator<< damit MyStream den Funktionszeiger von std::endl als Argument akzeptiert.
Dieser Ansatz ermöglicht es benutzerdefinierten Streams, wie MyStream im Beispiel, std::endl zu unterstützen und benutzerdefiniertes Verhalten bei der Verwendung bereitzustellen.
Das obige ist der detaillierte Inhalt vonUmgang mit „std::endl' beim Überladen von „. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!