Heim >Backend-Entwicklung >C++ >Wie gehe ich mit „std::endl' beim Überladen von benutzerdefinierten Stream-Operatoren um?

Wie gehe ich mit „std::endl' beim Überladen von benutzerdefinierten Stream-Operatoren um?

DDD
DDDOriginal
2024-12-08 08:26:12228Durchsuche

How to Handle `std::endl` in Custom Stream Operator Overloading?

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
{
    template 
    MyStream& 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!

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