Eigenen Stream mainipulator schreiben
-
Hallo,
ich benutze einen stream um aus einem Text einen Wert zu bekommen.
Bei einem boolschen Wert kann ich z.B. schreiben.cout << boolalpha << true;Hier wird tatsächlich "true" ausgegeben.
Wie kann ich einen Streammanipulator schreiben, der mir "yes" bzw. "no" ausgibt?
-
Das wird schwierig. Da wäre es wohl am besten, das Locale des Streams anzupassen (ich müsste mal zu Hause nachsehen, welche Facette du benötigst) und die Bezeichner für true und false in "yes" bzw. "no" zu ändern.
-
Den Zusammenhang hab ich bisher gar nicht gesehen.
Nur mal so aus Neugierde warum ist das schwierig?Kann es sein, dass dieser manipulator eigentlich nur ein Flag im Stream setzt?
-
Genau: Der Manipulator setzt nur ein Flag im Stream und der operator<< wertet dieses Flag dann aus, um zu entscheiden, wie er seine Werte darstellen soll. Das Problem dabei ist, daß du den ostream::operator<<(bool) ersetzen müsstest, um dieses Verhalten anzupassen - und an den kommst du nicht ran.
-
Habe mal auf blöd rumgesucht und dabei die Klasse std::__Locinfo gefunden. in der gibts eine Funktion:
const char *__CLR_OR_THIS_CALL _Getfalse() const { // return false name (no C source) return ("false"); }Arbeite mit VS2005.
Weiß jemand ein gutes Tutorial/Nachschlagewerk für den Themenbereich locale, facet, collate ?
-
templäd schrieb:
Wie kann ich einen Streammanipulator schreiben, der mir "yes" bzw. "no" ausgibt?
Das wird über die Facette numpunct geregelt. Dort sind die protected Methoden do_truename und do_falsename zu überladen. Zum Beispiel so:
#include <iostream> #include <locale> struct MyNumpunct : public std::numpunct< char > { protected: virtual string_type do_truename() const { return "yes"; } virtual string_type do_falsename() const { return "no"; } }; int main() { using namespace std; cout.imbue( locale( cout.getloc(), new MyNumpunct ) ); cout << boolalpha; // damit der Text komt cout << "Fuer 'true' : " << true << endl; cout << "Fuer 'false': " << false << endl; return 0; }templäd schrieb:
Habe mal auf blöd rumgesucht und dabei die Klasse std::__Locinfo gefunden. in der gibts eine Funktion:
const char *__CLR_OR_THIS_CALL _Getfalse() const { // return false name (no C source) return ("false"); }... das ist implementierungsabhängig.
templäd schrieb:
Weiß jemand ein gutes Tutorial/Nachschlagewerk für den Themenbereich locale, facet, collate ?
Das hier: <Standard C++ IOStreams and Locales>
Gruß
Werner