2017-01-14 52 views
0

在我的应用程序中,我有一个控制台(使用std :: out)和一个窗口(具有显示一些文本的函数)。我正在寻找的是一种在我的窗口中显示cout的最后一行的方法。我读过一些关于如何使自定义streambuf类或结构超载运算符的文章。我不能超载运算符,因为如果我这样做,我不能使用像endl这样的东西。将最后一行cout发送到窗口

另一个帖子here建议定义我自己的streambuf,但我不知道这是否是我的问题的一个好的解决方案。也许有人可以给我一个关于如何实现这个功能的建议。

+1

究竟你“COUT的最后一行”,并以“我的窗口”是什么意思? –

+0

最后一行是指自上次'\ n'字符后经过cout的所有内容,我的窗口是点云库中的PCLVisualizer,它具有函数addText(...),可以显示一些文本。 – Timo

回答

1

可以过载<<为此目的。为了使其与流操纵工作,你可以使用一个内部std::stringstream

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

我对此有类似的方法,但问题是流操纵器无法解析自定义类型中的字符和特征类型,我不想每次都写'endl >。我可以使用宏而不是 – Timo

+0

而是使用'tee'类的流缓冲区。詹姆斯坎泽曾经写过一篇关于它的文章。哦,是的,它链接到OP的链接SO问题,(http://stackoverflow.com/a/528661/464581)。 –