我的用例:我想要这些类
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
函数是什么/我需要在其中添加此逻辑以便捕获所有情况的功能?