2011-11-15 4 views
3

私はbasic_streambufでWinsockソケットの読み取りと書き込みを処理しています。 basic_filebufのように、std::codecvtオブジェクトを内部的に使用して、基礎となるソケットから読み取られたバイトを「ソケットstreambuf」のchar型に変換し、ソケットのstreambufに書き込まれた文字を下位のソケットに書き込むことができるバイトに変換します。これを行うために、私はstreambufの読み書き機能の両方のためにバッファを維持する必要があることを知っています。basic_streambuf :: setbufで設定するバッファはどれですか?

私が遭遇している論理的な問題は、streambufの実装が読み書きの両方に使用されることです(std::iostream constructorはstreambufへの単一のポインタを取ります)。しかし、オーバーライド可能なメンバ関数は1つしかありません基底のcharバッファーを設定するためにカスタマイズされています:setbuf。私のソケットのstreambufテンプレートのユーザーが基になるバッファを設定することを許可したい場合は、setbufは読み込みバッファまたは書き込みバッファを設定する必要がありますか?どのオプションが理にかなっていますか?両方std::istreamstd::ostreamが、の両方ものから

答えて

1

標準ストリームだけはsetbufで指定された2つの行動を持っています。 1つ目は、setbuf(0,0)が効果を持たないこと、2番目がbasic_filebufであることです.setbuf(0,0)がIOの前に呼び出された場合、IOはバッファされません。それ以外の場合、結果は実装定義になります。だからあなたの実装に合ったものを作って、それを文書化してください。

2

std::iostream継承バッファが含まstd::ios、から実質的に継承します。それらは両方とも実質的にstd::iosから継承するので、std::iostreamの塩基が1つしかなく、したがって1つの内部バッファのみが存在する。

C++ 2011年2月11日のドラフトより:

§27.6.3

クラステンプレートbasic_streambufは、そのオブジェクトそれぞれ制御する2つの文字種々 ストリームバッファを導出するための抽象基底クラスとして機能シーケンス:
- 文字入力シーケンス。
- 文字出力シーケンス。

§27.7.2

namespace std { 
template <class charT, class traits = char_traits<charT> > 
class basic_istream : virtual public basic_ios<charT,traits> { 

§27.7.3

namespace std { 
template <class charT, class traits = char_traits<charT> > 
class basic_ostream : virtual public basic_ios<charT,traits> { 
関連する問題