シリアル化ライブラリの簡単なテストのために、ソケットから読み書きできるstreambufを作成したいと思います。私はstreambufでバッファを使いたくないのですが、ソケットでこれを処理させてください。私は、シリアル化libはstd::istream::read
とstd::ostream::write
だけを呼び出すと確信しています。 Microsoftのbasic_streambufの実装を簡単に見てみると、これらの呼び出しは実質的に直接xsputn
とxsgetn
に転送されます。バッファリングされていないstd streambufの実装
質問:私はstreambufから派生し、xsputnとxsgetnを実装するだけで、私の実装を使用するストリームは常にsync/overflow/underflow/pback /ではなくこれらのメソッドを呼び出すことができますか? ?それ以外の場合は、エラーなどを返すためにsyncなどをオーバーライドする必要がありますか、または標準で実装されていることが保証されていますか? Preferrablyこれは共通のプラットフォームで動作するはずです。私はboost :: iostreamsを使用できません。それは(ほとんど?)のバッファなしstd::streambuf
を実装することは不可能
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;
};
+1。 sputnとxsputnは、より効率的に実装することができない限り、しばしばsputcの観点から実装されます。 – Pete
aha。 overflow、underflow、sync、xsputn/xsgetnを実装すれば十分でしょうか? – stijn
@stijn:はい、 'xsputn'と' xsgetn'を実装する必要はありません。 'overflow'を実装したら、カスタム' xsputn'を使っても利点がありません。デフォルトの実装は 'underflow'を使って実装されているので、' uflow'をオーバーロードする必要はありません。 –