basic_ostream und << operator
-
hi,
in der ios_base werden ja die fmtflags (hex, dec, ...) als "static const fmtflags blabla" definiert, wobei fmtflags ein normales typedef zu sein scheint. Wie überlädt die STL dann denn << operator (zB in basic_ostream [abgelitten von ios_base]) für fmtflags? Ich mein fmtflags ist ja (leider) in C++ kein wirklich neuer Typ, d.h. wenn ich fmtflags zB vom Typ int mache, dann kann ich nicht gleichzeitig den << operator für int und für fmtflags überladen. Des führt zu nem Compilerfehler. Aber wie macht des die STL dann?
Danke für alle Antworten

-
fmtflags ist wie folgt in ios_base definiert:
enum _Ios_Fmtflags { //-- Hier sind alle Formatflags aufgeführt _S_boolalpha = 1L << 0, _S_dec = 1L << 1, // .. } class ios_base { public: typedef _Ios_Fmtflags fmtflags; // .. };Damit ist fmtflags eindeutig ein neuer Datentyp für C++ und kann für die Überladung der << - operatoren verwendet werden.
-
Danke, hat mir sehr weitergeholfen. Noch eine Frage: In welcher Klasse wird den der << Operator für fmtflags überladen? in ios_base, basic_ios, basic_ostream oder erst in ostream?
Danke

[edit: gibts irgendwo ne gute Referenz über das Innenleben der STL?]
-
Ich wußte gar nicht, daß es überhaupt einen überladenen op<< für Fomatflags gibt. Die Maipulatoren, mit denen du die Flags setzen kannst, haben zwar teilweise den selben Namen, sind aber etwas völlig eigenständiges.
bluecode schrieb:
[edit: gibts irgendwo ne gute Referenz über das Innenleben der STL?]
www.cppreference.de ist ein guter Anlaufpunkt. Außerdem erscheint diese Woche der zweite Teil meine Serie im Magazin.
-
CStoll schrieb:
Ich wußte gar nicht, daß es überhaupt einen überladenen op<< für Fomatflags gibt. Die Maipulatoren, mit denen du die Flags setzen kannst, haben zwar teilweise den selben Namen, sind aber etwas völlig eigenständiges.
Wird bei
std::cout << std::hex;etwa nicht der Operator
std::ostream &operator << (std::ostream &, std::fmtflags);aufgerufen? Wenn nicht, welcher dann? Ich verstehs grad net wirklich...
Ich kenne cppreference.com schon und find des nicht wirklich ne tolle Referenz (wie gesagt für das Innenleben). Ich bräucht halt paar mehr Informationen, weil ich für meinen Kernel teilweise ne standardlib nachprogrammieren will.
-
bluecode schrieb:
Wird bei
std::cout << std::hex;etwa nicht der Operator
std::ostream &operator << (std::ostream &, std::fmtflags);aufgerufen? Wenn nicht, welcher dann? Ich verstehs grad net wirklich...
Nein, vor allem da die Formatflags nicht frei im Namensraum std stehen (die Flags sind Teil von std::ios_base). Im Namensraum std hast du aber eine Funktion "basic_ios<>& hex(basic_ios<>&)", die dort oben eingesetzt wird - und die "triggert" einen
std::ostream& operator<<(std::ostream&, std::ios&(*)(std::ios&));