无缓冲的std streambuf实现

sti*_*ijn 4 c++ sockets iostream

为了快速测试一个序列化库,我想创建一个可以读/写套接字的streambuf.我不想在streambuf中使用缓冲区,但让socket处理它.我确信序列化lib只会调用std::istream::readstd::ostream::write.快速浏览一下Microsoft的basic_streambuf实现,可以看出这些调用实际上是直接转发给xsputnxsgetn.

问题是:我可以从streambuf派生并只实现xsputn和xsgetn,并确保使用我的实现的流将始终调用这些方法,而不是sync/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;
};
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 6

std::streambuf没有缓冲区的情况下实现(几乎?)是不可能的.你将不得不重载underflow,overflow因为许多公共接口std::streambuf不会通过xsputnxsgetn.例如sputc,sbumpc甚至sputn不保证xsputn根据内部缓冲区的状态和特定std::streambuf实现来引起调用.