Hallo Bastian, Bastian Schern schrieb am 09.10.2003 13:03:
ich habe mir eine eigene Klasse geschrieben, die ich für Ausgaben auf den Bildschirm oder/und in ein File verwende.
--- snip --- DebugLog& DebugLog::operator<<( ostream& (*out)(ostream&) ) [...]
Es werden auch "endl", usw. unterstützt. Wie bekomme ich es hin, dass jetzt auch noch Manipulatoren unterstützt werden?
Ich würde nämlich gerne folgendes machen:
DebugLog debug; debug << setfill(' ') << setw(3) << i << endl;
Als erstes gehe ich mal davon aus, daß deine Klasse eine entsprechende Methode besitzt: class DebugLog { public: virtual SetFill(char chAPad); ... Dann implementierst du den Manipulator so: template <class tParamType> class DebugLogManip { public: typedef DebugLog& (*tfnWork)(DebugLog&, tParamType); // Konstruktoren DebugLogManip(tfnWork fnAWork, tParamType xAArg) : mfnWork(fnAWork), mxArg(xAArg) {}; // Operatoren friend DebugLog& operator<<(DebugLog& oALog, DebugLogManip<tParamType>& oAManip) { return (oAManip.mfnWork(oALog, oAManip.mxArg)); } private: tfnWork mfnWork; tParamType mxArg; }; Ich habe gleich eine Template-Implementation gewählt, da du dann für die div. Manipulatoren nur noch eine einfache Funktion anlegen mußt: inline ios& DebugLogManipSetFill(DebugLog& oALog, char chAPad) { oALog.SetFill(chAPad); return (oALog); } Zu guter Letzt brauchst du für jeden Manipulator noch eine globale Funktion mit der entsprechenden Template-Instantiierung: inline DebugLogManip<char> setfill(char chAPad) { return DebugLogManip<char>(DebugLogManipSetFill, chAPad); } Viel Erfolg Raimund P.S. - ich habe den Code aus dem Gedächtnis hingeschrieben, also sind sicherlich auch noch Syntaxfehler enthalten, aber ich denke, daß die Beispiele prinzipiell funktionieren sollten.