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:
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 >
References