alle operator<<'s von ostringstream überschreiben
-
Hi,
ich habe folgendes Problem:
Ich habe eine Klasse, die von ostringstream ableitet. Diese Klasse kann ich nun per
Objektderklasse << "hallo" << 1 << endl;ansprechen, was auch super funktioniert. Nur leider will ich jetzt den geerbten operator<< dieser klasse so überschreiben, dass er je nach zustand der klasse die übergebenen Daten woanders hinschreibt (ich habe eigene streambuf-objekte, und der operator soll jeweils in einem std::bitset nachlesen, in welche dieser objekte er reinschreiben soll).
Ich habe bereits versucht, den geerbten operator<< mit einem funktionstemplatetemplate<class T> ostream& operator<<(T)zu überschreiben, aber das hat verständlicherweise nicht funktioniert, da er dann z.B. c-strings als char* interpretiert (was sie ja auch sind :)) und lediglich deren adresse ausgibt.
Jetzt ist meine Frage, wie ich das Problem lösen kann. Muss ich alle 20(?) verschiedenen operator<<(xyz) der klasse ostream überschreiben oder gibt es eine bessere(elegantere möglichkeit)?
-
template<class T> MyStream& operator<<(const T& v) { static_cast< std::ostringstream& >( *this ) << v; return *this; }
-
erstaunlich, das hat funktioniert, auch wenn ich mir nicht erklären kann, wieso er jetzt plötzlich die c-strings als solche ausgibt und nicht mehr nur als adressen der char*
danke!
-
Hallo,
Heinzelotto schrieb:
auch wenn ich mir nicht erklären kann, wieso er jetzt plötzlich die c-strings als solche ausgibt und nicht mehr nur als adressen der char*
Weil es einen Unterschied macht, ob ein const char* oder ein char* ausgegeben werden soll. Für beide wird jeweils eine andere Funktion aufgerufen, eine, die Zeiger (jeglicher) Art annimmt, und deswegen sinnvollerweise nur den Zeigerwert ausgeben kann, und eine, die wirklich const char* erwartet, so dass dann die "übliche" Zeichenketteninterpretation stattfinden kann. Hier muss man sich im Klaren darüber sein, dass ein Zeichenkettenliteral wie "hallo" als const char* anzusehen ist.
MfG,
Probe-Nutzer