在我的应用程序中,我有一个控制台(使用std :: out)和一个窗口(具有显示一些文本的函数)。我正在寻找的是一种在我的窗口中显示cout的最后一行的方法。我读过一些关于如何使自定义streambuf类或结构超载运算符的文章。我不能超载运算符,因为如果我这样做,我不能使用像endl这样的东西。将最后一行cout发送到窗口
另一个帖子here建议定义我自己的streambuf,但我不知道这是否是我的问题的一个好的解决方案。也许有人可以给我一个关于如何实现这个功能的建议。
在我的应用程序中,我有一个控制台(使用std :: out)和一个窗口(具有显示一些文本的函数)。我正在寻找的是一种在我的窗口中显示cout的最后一行的方法。我读过一些关于如何使自定义streambuf类或结构超载运算符的文章。我不能超载运算符,因为如果我这样做,我不能使用像endl这样的东西。将最后一行cout发送到窗口
另一个帖子here建议定义我自己的streambuf,但我不知道这是否是我的问题的一个好的解决方案。也许有人可以给我一个关于如何实现这个功能的建议。
你可以过载<<
为此目的。为了使其与流操纵工作,你可以使用一个内部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;
}
};
我对此有类似的方法,但问题是流操纵器无法解析自定义类型中的字符和特征类型,我不想每次都写'endl
而是使用'tee'类的流缓冲区。詹姆斯坎泽曾经写过一篇关于它的文章。哦,是的,它链接到OP的链接SO问题,(http://stackoverflow.com/a/528661/464581)。 –
究竟你“COUT的最后一行”,并以“我的窗口”是什么意思? –
最后一行是指自上次'\ n'字符后经过cout的所有内容,我的窗口是点云库中的PCLVisualizer,它具有函数addText(...),可以显示一些文本。 – Timo