2017-01-14 7 views
0

In meiner Anwendung habe ich eine Konsole (die std :: out verwendet) und ein Fenster (das eine Funktion hat, um etwas Text anzuzeigen). Nach was ich suche, ist eine Weise, die letzte Linie von Cout in meinem Fenster zu zeigen. Ich habe einige Artikel über das Erstellen einer benutzerdefinierten Streambuf-Klasse oder einer Struktur gelesen, die einfach den Operator < < überlädt. Ich kann den Operator < < nicht überladen, weil ich nicht in der Lage bin, Dinge wie endl zu benutzen, wenn ich das tue.Sende die letzte Zeile von cout an ein Fenster

Ein anderer Beitrag here schlagen vor, meine eigenen streambuf zu definieren, aber ich weiß nicht, ob das eine gute Lösung für mein Problem ist. Vielleicht kann mir jemand einen Ratschlag geben, wie ich dieses Feature implementieren soll.

+1

Was genau meinen Sie mit „die letzte Zeile von cout“, und von „meinem Fenster“? –

+0

Mit letzter Zeile meine ich alles, was seit dem letzten '\ n'-Zeichen durch cout gegangen ist, und mein Fenster ist ein PCLVisualizer aus der Punktwolken-Bibliothek, die eine Funktion addText (...) hat, wo ich Text anzeigen kann. – Timo

Antwort

1

Sie können Überlastung << für diesen Zweck. Um es mit Strom Manipulatoren funktioniert, könnten Sie eine interne std::stringstream verwenden:

class out 
{ 
    std::ostringstream ss; 
    std::string display_str; 
    public: 
    template <typename T> out &operator<<(T &&obj) 
    { 
     std::cout << obj; 
     ss.str(""); 
     ss << obj; 
     std::string tmp = ss.str(); 
     if (tmp.size() == 0) 
      return *this; 
     const char *ptr = &tmp[0], *start = ptr; 
     while (*ptr) 
     { 
      if (*ptr == '\n') 
       start = ptr+1; 
      ptr++; 
     } 
     if (start != ptr) 
      display_str = start; 
     else 
      display_str += start; 
     update_display_string(display_str); // Replace this with your update function. 
     return *this; 
    } 
}; 
+0

Ich hatte eine ähnliche Vorgehensweise, aber das Problem ist, dass Stream-Manipulator nicht Char und Traits Typ in benutzerdefinierten Typen auflösen kann und ich will nicht schreiben 'endl >' jedes Mal. Ich könnte jedoch ein Makro verwenden – Timo

+0

Verwenden Sie lieber einen "Tee" -ähnlichen Stream-Puffer. James Kanze hat einmal einen Artikel darüber geschrieben. Oh ja, es ist verknüpft mit in der verknüpften SO-Frage des OP, (http://stackoverflow.com/a/528661/464581). –

Verwandte Themen