Mailinglist Archive: opensuse-programming-de (184 mails)
| < Previous | Next > |
Re: Eigene Ausgabe in C++ (mit Manipulatoren)
- From: Raimund Hölle <mailings@xxxxxxxxxxxxxxxx>
- Date: Fri, 10 Oct 2003 11:23:48 +0100
- Message-id: <3F8688B4.2030703@xxxxxxxxxxxxxxxx>
Hallo Bastian,
Bastian Schern schrieb am 09.10.2003 13:03:
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.
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.
| < Previous | Next > |