Heim > Backend-Entwicklung > C++ > Umgang mit „std::endl' beim Überladen von „

Umgang mit „std::endl' beim Überladen von „

Susan Sarandon
Freigeben: 2024-12-07 04:25:21
Original
330 Leute haben es durchsucht

How to Handle `std::endl` When Overloading the `

Ü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:

#include 

struct 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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage