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. permyLog << "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. permyLog << "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
TestheiniDu könntest in jedem operator<< dein SendToBla aufrufen oder ein spezielles Token benutzen, dass dann die Ausgaben schreibt (so wie std::flush)