Haben Sie eine C ++ Klasse wirken wie eine benutzerdefinierte Ostream, sstream
-
03-07-2019 - |
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?
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);
}