如何捕获对std :: stringbuf子类的所有写操作?

时间:2019-03-06 17:31:58

标签: c++ stl ostream streambuf

我的用例:我想要这些类

class MyBuffer : public std::stringbuf {...}

class MyStream : public std::ostream {...}

MyStream将拥有一个MyBuffer,并将其用于存储大块的东西,这些东西稍后将转发到其他地方。据我所知,MyStream上的插入运算符正在正确地将数据放入m_my_buffer

MyStream::MyStream () : std::ostream (& m_my_buffer) {...}

根据我不完全理解的建议(但这似乎可行),此虚拟函数已重载

int MyBuffer::sync ()
{
     // write str() to some other location then call str("") to reset
     return 0;
}

到目前为止,很好。

现在我要做的是基于某种条件防止将数据写入MyStream::m_my_buffer。我假设stringbuf上最终将有一个或两个虚拟方法实际写入数据,并且通过重写这些方法,我可以在数据输入时添加条件。

这是我发现的东西:

  • streambuf::sputc在内部,如果放置指针(overflow)上没有可用的写入位置,则该函数将调用虚拟受保护成员pptr否则,该函数将直接使用放置指针(pptr),而不会调用虚拟成员函数。 (添加了强调)

  • streambuf::sputn调用受保护的虚拟成员xsputn

  • streambuf::xsputn将s所指向的数组中的字符写入受控输出序列,直到写入n个字符或到达输出序列的末尾为止。

这看起来不像一个统一的界面。如果要添加此逻辑:

void MyBuffer::write_some_data (args...) override
{
    if (condition ())
       return;
    else
       std::stringbuf::write_some_data (args...);
}

write_some_data界面中的stringbuf函数是什么/我需要在其中添加此逻辑以便捕获所有情况的功能?

0 个答案:

没有答案