Frage

Ich habe eine C ++ Klasse MyObject und ich möchte diese Daten in der Lage sein zu füttern, wie ich würde zu einem osstream (aber im Gegensatz zu einer direkten sstream, haben die eingehenden Daten eine besondere Art und Weise formatiert werden). Ich kann nicht scheinen, um herauszufinden, wie man einen Bediener, um eine Überlastung für MyObject Eingang, um es zu essen gegeben.

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 das Objekt sagen, dass, wann immer ein <<something setzen: um das etwas.

Ist das möglich?

War es hilfreich?

Lösung

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 der Lage sein, in den Strom schieben, aber es sollte für alle Grundlagen arbeiten.

Andere Tipps

Sie können die Antworten für Wie kann ich meine eigene Ostream / streambuf erstellen ? hilfreich.

Ich würde einen etwas anderen Ansatz und ein formater-Objekt erstellen.
Das formater Objekt würde dann das Einfügen von Formatierungszeichen handhaben, wenn es um einen Strom angelegt 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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top