2009-07-16 9 views
0

ich diese Frage auf archivierte Datei gefunden bei joelonsoftware.com http://discuss.joelonsoftware.com/default.asp?joel.3.594503.11Overloading << zum Manipulatoren definieren

„Hallo,

ich ein besonders langsam Tag habe und kann nicht meinen Kopf . Runde ein Bediener Überlastung Problem würde ich eine Klasse gerne in der Lage sein zu akzeptieren, Daten über einen Einschieben Operator, das heißt:

myClassInstance < < std :: string ("a string") < < 3.4 < < std :: endl;

Intern, ich möchte alles oben in einem string so kann ich dann Farm es zu anderen Strömen (zB std :: cout und ein ofstream) weg zu beenden. Ich habe schrecklich verwirrt bekam, wie ich die ohne tun kann einen Bediener < < Überlastung für jeden Datentyp zu schreiben, und wie ein Eingangsstrom würde auf den ersten Anruf erstellt werden (myClassInstance < < ...) .

Jede dankbar empfängt Hilfe!“

Das ist genau das, was ich zu tun versuchen. Ich habe durch die Definition von Vorlagen und andere überladene Methode Weg zu behandeln alle Arten gefunden mit Manipulatoren wie endl beschäftigen definiert in ostream Klasse.

UIStream& UIStream ::operator << (const T str) 
{ 
    CString cstr(stringify(str).c_str()); 
    theFrame->m_pOutputView->WriteMessage(cstr); 
    return *this; 
} 

//for manipulators like std::endl 
UIStream& UIStream ::operator <<(ostream& (*m)(ostream&)) 
{ 
    //stream<<*m; 
    //CString cstr((*m)(new ostream).c_str()); 
    if(*m==&std::endl); 
     theFrame->m_pOutputView->WriteMessage("\n"); 
    return (*this); 
} 

bin ich kämpfen immer noch mit Manipulatoren, die Argumente wie hex dez oder Oktober dieses nehmen in ios_base definiert.

+0

Dies wurde bereits in zwei Posts von demselben Benutzer behandelt. Bitte, Kazoom, lies die Antworten! –

+0

Bist du sicher? Ich dachte, die Frage bezog sich auf den Umgang mit Manipulatoren, die Argumente nehmen, etwas, das von den anderen Fragen nicht abgedeckt wird, soweit ich das beurteilen kann. Obwohl ich sage, dass hex, dec und oct keine Manipulatoren sind, die Argumente nehmen ... – Troubadour

+1

Diese Frage wurde bereits zuvor beantwortet (unter anderem in meiner Antwort hier: http://stackoverflow.com/questions/1133739/how- does-of-stream-oder-ostream-type-cast-all-types-to-string/1134501 # 1134501) –

Antwort

1

Die Art, wie ich gehen würde, ist nur, um ein std :: stringstream in MyClass aufzunehmen, und < < überlasten, um eine MyClass als LHS und alles als RHS zu nehmen.

bearbeiten: Ich denke, es ist nicht genau das, was Sie suchen. Trotzdem könnte es für einfachere Anwendungen nützlich sein.

+0

Ich würde so etwas auch tun. Außer ich würde einen Verweis auf 'MyClass' anstelle von 'ostringstream' zurückgeben. –

+0

Diese Vorlage passt nicht zu Manipulatoren (std :: endl, std :: hex ...), die mit Überladungen ohne Vorlagen behandelt werden müssen. –

+0

@Matt: tatsächlich würde es es vielseitiger machen; @ Dribeas: Ooh, ich habe heute etwas gelernt. Ich würde deine Antwort auf die Frage empfehlen, mit der du verlinkt hast. –

2

Um Ihren Stream mit Manipulatoren arbeiten zu lassen, die Argumente verwenden, ist das nicht ganz so einfach, wie wenn sie keine Argumente haben. Das Problem ist, dass der maniuplator der Form sein wird

ImpDefClass manipulator(argument list); 

wo ImpDefClass ist, wie der Name schon sagt, eine Implementierung definiert Klasse. Zum Beispiel auf meinem System wird setprecision als

erklärt
inline _Setprecision setprecision(int __n); 

wo _Setprecision ist nur ein struct, die meine Implementierung selbst definiert.

Das Problem damit ist, dass Sie nicht nur einen neuen Stream Operator wie

UIStream& operator<<(UIStream&, XXX); 

schreiben kann, weil XXX die Implementierung definierte Klasse ist. Ich bin mir nicht sicher, wie ich das umgehen soll, anstatt eigene Manipulatoren zu definieren, die dieselben Aufgaben ausführen oder den Code an bestimmte Implementierungen anschließen.

0

Je mehr Fragen Sie stellen, desto mehr bin ich überzeugt, dass der richtige Ansatz für Ihr Problem ein neues streambuf schreibt. Dafür gibt es eine Dokumentation im Netz - die Erklärung hier wäre etwas zu lang für mich - und es gibt eine Booster-Bibliothek namens Iostreams, die dir helfen kann.

Verwandte Themen