数日前、私は先読みstreambuf
を使用するサブクラスを作成するのが楽しいだろうと決めました。mmap
私のSTL(SGI)がどのように実装され、が含まれているfilebuf
ことに気づいたかを調べました。したがって、から継承することは問題外です。basic_filebuf
FILE*
basic_filebuf
だから私はから継承しましたbasic_streambuf
。それから私は自分mmapbuf
をfstreamにバインドしたかった。
私がしなければならない唯一のことはfilebuf
...の暗黙のインターフェースをコピーすることだと思いましたが、それは明らかな間違いでした。SGIでは、basic_fstream
を所有していbasic_filebuf
ます。を呼び出しbasic_filestream.std::::ios::rdbuf( streambuf* )
ても、ファイルストリームはそれを完全に無視し、独自のを使用しfilebuf
ます。
だから今、私は少し混乱しています...確かに、私は自分自身を作成することができます、mmfstream
それは正確なコピー/貼り付けになりますfstream
が、それは実際にはDRY指向ではないように聞こえます。
私が理解できないのは、なぜfstream
これほど緊密に結合されているので、 ?filebuf
以外のものを使用できないのかということです。filebuf
ストリームとbufsを分離することの全体的なポイントは、異なるバッファーを持つストリームを使用できることです。
ソリューション:
=>filestream
の暗黙のインターフェースに依存する必要がありますfilebuf
。つまり、fstreamはstreambufクラスによってテンプレート化する必要があります。これにより、の暗黙的なインターフェイスfstream
を実装している限り、誰もが独自のstreambufサブクラスをに提供できるようになります。問題:テンプレートテンプレートパラメーターとして使用しているときにテンプレートセレクターが破損するため、にfilebuf
テンプレートパラメーターを追加できません。fstream
fstream
=>filebuf
追加の属性のない純粋な仮想クラスである必要があります。そのため、すべてのFILE*ガベージを実行せずに継承できます。
このテーマに関するあなたの考えは?