для быстрого тестирования библиотеки сериализации я хочу создать потоковый буфер, который может читать / записывать в / из сокета. Я не хочу использовать буфер в streambuf, но пусть сокет обрабатывает это. Я уверен, что библиотека сериализации будет вызывать только std::istream::read
и std::ostream::write
. Беглый взгляд на реализацию basic_streambuf от Microsoft показывает, что эти вызовы практически напрямую перенаправляются на xsputn
и xsgetn
.
Вопрос в том, могу ли я наследовать от 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;
};