std::cout intern



  • Hallo!

    Ich wollte mal spaßhalber std::cout nachprogrammieren und stand relativ schnell vor einem Problem:

    Man betrachte folgende Zeile:
    std::cout << "Hallo" << "wie" << "gehts";

    Umgewandelt sollte das dann so aussehen:
    std::cout.operator<<("Hallo").operator<<("wie").operator<<("gehts");

    Nun die Frage: Wie weiß cout, wann der letzte operator<< aufgerufen wurde??



  • operator<< ist nicht innerhalb der Klasse von std::cout (std::ostream) implementiert, sondern als operator<<(std::ostream, std::string) (z.B. für die Ausgabe von Strings und gibt wieder einen std::ostream zurück. Auf diesem zurückgegebenen std::ostream kann dann eben wieder der operator<< aufgerufen werden, indem einfach ein "<< naechsterString" angehängt wird.



  • Testheini schrieb:

    Hallo!

    Ich wollte mal spaßhalber std::cout nachprogrammieren und stand relativ schnell vor einem Problem:

    Man betrachte folgende Zeile:
    std::cout << "Hallo" << "wie" << "gehts";

    Umgewandelt sollte das dann so aussehen:
    std::cout.operator<<("Hallo").operator<<("wie").operator<<("gehts");

    Nun die Frage: Wie weiß cout, wann der letzte operator<< aufgerufen wurde??

    cout muss das nicht wissen. Der Compiler ruft schon die richtige Anzahl auf.



  • Der Compiler ruft überhaupt nichts auf.



  • Der Trick liegt darin, dass der operator<< eine Referenz auf den Stream zurückgibt, den man ihm mitgibt. Mal Pseudo-Code:

    ostream &operator<<(ostream &os, int i) {
      //...
    
      return os;
    }
    

    Das bedeutet, dass

    os << 2 << 3;
    

    Zunächst os << 2 auswertet, os als Rückgabewert hat und dann quasi os << 3 auswertet.



  • std::cout << "Hallo" << "wie" << "gehts";
    

    bedeutet umgewandelt:

    std::operator<<(std::operator<<(std::operator<<(std::cout, "Hallo"), "wie"), "gehts");
    

    Dies gilt, da "Hallo" als "char const *" übergeben wird, und der entsprechende operator<< eine freistehende Funktion ist. Dagegen sind für die fundamentalen Datentypen außer den char Varianten und Pointern darauf die operator<< Funktionen einfache Memberfunktionen von cout.



  • Interessant, danke für die Antworten.
    Es geht mir eigentlich um Folgendes: Ich schreibe eine Art Logfile und möchte z.B. per

    myLog << "Programmstart am " << date << " erfolgt";
    

    debug meldungen ausgeben. myLog soll den zusammengestückelten String dann an ein debug fenster senden. Das Problem ist jetzt, daß ich ja nicht weiß, in welchem Operator<< ich SendToDbgWnd() aufrufen soll... ist hier ein ein endeutiges "<< end;" unumgänglich oder kann das jetz anders auch gelöst werden?

    mfG
    Testheini



  • Testheini schrieb:

    Interessant, danke für die Antworten.
    Es geht mir eigentlich um Folgendes: Ich schreibe eine Art Logfile und möchte z.B. per

    myLog << "Programmstart am " << date << " erfolgt";
    

    debug meldungen ausgeben. myLog soll den zusammengestückelten String dann an ein debug fenster senden. Das Problem ist jetzt, daß ich ja nicht weiß, in welchem Operator<< ich SendToDbgWnd() aufrufen soll... ist hier ein ein endeutiges "<< end;" unumgänglich oder kann das jetz anders auch gelöst werden?

    mfG
    Testheini

    Du könntest in jedem operator<< dein SendToBla aufrufen oder ein spezielles Token benutzen, dass dann die Ausgaben schreibt (so wie std::flush)


Log in to reply