3

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

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

4

2 に答える 2

2

std::iostreamstd::istreamはとの両方から継承しますstd::ostreamが、どちらもバッファを含むから実質的に継承します。std::iosどちらも実質的に から継承しているため、のベースはstd::ios1 つだけであり、内部バッファも 1 つだけです。std::iosstd::iostream

2011 年 2 月の C++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> {
于 2011-11-15T23:10:22.547 に答える
1

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

于 2011-11-17T16:46:42.517 に答える