2011-08-18 13 views
4

シリアル化ライブラリの簡単なテストのために、ソケットから読み書きできるstreambufを作成したいと思います。私はstreambufでバッファを使いたくないのですが、ソケットでこれを処理させてください。私は、シリアル化libはstd::istream::readstd::ostream::writeだけを呼び出すと確信しています。 Microsoftのbasic_streambufの実装を簡単に見てみると、これらの呼び出しは実質的に直接xsputnxsgetnに転送されます。バッファリングされていない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; 
}; 

答えて

6

実際に私はこのようなものを使用すると思います。 とoverflowには、std::streambufへの公開インターフェイスの多くがxsputnまたはxsgetnを経由しないため、オーバーロードする必要があります。例えば。 sputcsbumpcなどsputnでも、内部バッファの状態と特定のstd::streambufの実装に応じて、xsputnというコールが発生することは保証されません。

+0

+1。 sputnとxsputnは、より効率的に実装することができない限り、しばしばsputcの観点から実装されます。 – Pete

+0

aha。 overflow、underflow、sync、xsputn/xsgetnを実装すれば十分でしょうか? – stijn

+1

@stijn:はい、 'xsputn'と' xsgetn'を実装する必要はありません。 'overflow'を実装したら、カスタム' xsputn'を使っても利点がありません。デフォルトの実装は 'underflow'を使って実装されているので、' uflow'をオーバーロードする必要はありません。 –

関連する問題