Raimund Hölle schrieb:
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.
Hui, das sieht aber kompliziert aus. Ich hatte gedacht, dass es ähnlich wie mit "endl" funktioniert. Werde es aber gleich mal ausprobieren. Viele Grüße Bastian