对序列化库的一些快速测试我想创建一个可以读/写套接字的streambuf。我不想在streambuf中使用缓冲区,但让socket处理它。我确信序列化lib只会调用std::istream::read
和std::ostream::write
。快速浏览一下Microsoft的basic_streambuf实现,可以看出这些调用几乎直接转发到xsputn
和xsgetn
。
问题是:我可以从streambuf派生并只实现xsputn和xsgetn,并确保使用我的实现的流将始终调用这些方法,而不是同步/ overflow / underflow / pback / ...?或者我应该覆盖同步等以返回错误,还是标准保证默认实现是正常的?这应该适用于任何通用平台,我不能使用boost :: iostreams。
实际上我会使用这样的东西:
class socket_buf : public std::streambuf
{
public:
//Socket is a class with std::stream-like read/write methods
MyBuf( Socket& s ) : sock( s ) {}
protected:
std::streamsize xsputn( const char* s, std::streamsize n )
{
return sock.write( s, n );
}
std::streamsize xsgetn( char* s, std::streamsize n )
{
return sock.read( s, n );
}
private:
Socket& sock;
};
答案 0 :(得分:6)
在没有缓冲区的情况下(几乎没有)实现std::streambuf
是不可能的。由于underflow
的许多公共接口不会通过overflow
或std::streambuf
,因此您必须重载xsputn
和xsgetn
。例如。 sputc
,sbumpc
等等。根据内部缓冲区的状态和特定的sputn
实现,即使xsputn
也不能保证会调用std::streambuf
。