2009-05-05 8 views
6

Ich habe eine C++ - Klasse MyObject und ich möchte in der Lage sein, diese Daten wie ich zu einem Ostream (aber im Gegensatz zu einem direkten Stream, die eingehenden Daten formatiert sein müssen a spezieller Weg). Ich kann nicht herausfinden, wie ich einen Operator für MyObject überlasten kann, um die Eingabe zu essen.Haben Sie eine C++ - Klasse wie eine benutzerdefinierte ostream, Stream

class MyObject { 
public: 
    ostringstream s; 
    FEEDME 
}; 


int main() { 
    MyObject obj; 
    obj.FEEDME << "Hello" << 12345; 

    // I want obj.s == ":Hello::12345:" 

} 

Ich mag es so satt jedes Element in von umgeben sein:

So in dem gegebenen Beispiel s = ": Hallo :: 12345" sollte das Endergebnis sein. Was meine Frage ist, wie kann ich dem Objekt sagen, dass wenn immer ein <<something, setzen:: um das Etwas.

Ist das möglich?

Antwort

9

versuchen Sie dies:

class MyObject { 
public: 
    template <class T> 
    MyObject &operator<<(const T &x) { 
     s << ':' << x << ':'; 
     return *this; 
    } 

    std::string to_string() const { return s.str(); } 

private: 
    std::ostringstream s; 
}; 

MyObject obj; 
obj << "Hello" << 12345; 
std::cout << obj.to_string() << std::endl; 

Es gibt bestimmte Dinge, die Sie nicht in den Strom Schubs der Lage sein, aber es sollte für alle Grundlagen arbeiten.

+0

Danke, ich glaube, ich habe Fundament, wie es jetzt umzusetzen, noch einen Fehler immer „Fehler: ungültige Verwendung von Elemente (? Sie den‚&‘vergessen haben)“ für MyObject & operator < <(const T & x) { Aber wird sich damit herumschlagen und gelöst werden. Danke, mein guter Herr. –

+0

Ich denke, dass kompiliert in g ++ 4.3.3, was Compiler verwenden? –

+0

g ++ (GCC) 4.3.2, Sie sind richtig, es kompiliert und funktioniert genau so, wie ich es will! Vielen Dank. Das Problem scheint etwas besonderes für mein Programm zu sein. –

1

Ich würde einen etwas anderen Ansatz nehmen und ein Formater-Objekt erstellen.
Das Formater-Objekt würde dann das Einfügen von Format-Zeichen behandeln, wenn es auf einen Stream angewendet wird.

#include <iostream> 

template<typename T> 
class Format 
{ 
    public: 
     Format(T const& d):m_data(d) {} 
    private: 
     template<typename Y> 
     friend std::ostream& operator<<(std::ostream& str,Format<Y> const& data); 
     T const& m_data; 
}; 
template<typename T> 
Format<T> make_Format(T const& data) {return Format<T>(data);} 

template<typename T> 
std::ostream& operator<<(std::ostream& str,Format<T> const& data) 
{ 
    str << ":" << data.m_data << ":"; 
} 




int main() 
{ 
    std::cout << make_Format("Hello") << make_Format(123); 
} 
Verwandte Themen