我正在使用basic_streambuf
来处理从Winsock套接字读取和写入。就像basic_filebuf
一样,我在内部使用std::codecvt
对象将从底层套接字读取的字节转换为“socket streambuf”的char类型,以及将写入套接字streambuf的字符转换为字节可以写入底层套接字。为了做到这一点,我发现我需要为streambuf的读写功能维护缓冲区。
我遇到的逻辑问题是streambuf实现旨在用于读取和写入(std::iostream
constructor采用单指针到streambuf),但只有一个可覆盖的成员函数可以自定义以设置基础char缓冲区:setbuf
。如果我想允许套接字streambuf模板的用户设置底层缓冲区,那么setbuf
应该设置读缓冲区还是写缓冲区?哪个选项更有意义?
答案 0 :(得分:2)
std::iostream
继承自std::istream
和std::ostream
,但那些都是从包含缓冲区的std::ios
虚拟继承的。由于它们都是从std::ios
虚拟继承的,因此std::ios
只有std::iostream
个基数,因此只有一个内部缓冲区。
来自C ++ 2011年2月11日草案:
§27.6.3
类模板basic_streambuf用作派生各种的抽象基类 流缓冲区,其对象各自控制两个字符序列:
- 字符输入序列;
- 字符输出序列。
§27.7.2
namespace std {
template <class charT, class traits = char_traits<charT> >
class basic_istream : virtual public basic_ios<charT,traits> {
§27.7.3
namespace std {
template <class charT, class traits = char_traits<charT> >
class basic_ostream : virtual public basic_ios<charT,traits> {
答案 1 :(得分:1)
标准流只有两个指定的行为与setbuf。第一个是setbuf(0,0)可能没有效果,第二个是basic_filebuf,其中,如果在任何IO之前调用setbuf(0,0),那么IO是无缓冲的。否则结果是实现定义的。所以,只需对您的实现做有意义的事情,然后记录下来。