カスタム ostream の実装方法を理解するためのガイダンスまたは指針が必要です。私の要件は次のとおりです。
- 複数のデータ型の「<<」演算子を持つクラス。
- 意図は、出力をデータベースに送信することです。各「行」は個別のレコードに移動する必要があります。
- 各レコードの最も重要なフィールドはテキスト (またはブロブ) ですが、時間などの他のフィールドはほとんど自動的に推測できます。
- レコードごとにデータベースにアクセスしたくないので、バッファリングは重要です。
まず、ostream から派生させる価値はありますか? ostream から派生すると何が得られますか? 私のクラスがいくつかoperator<<
のメソッド (いくつかのカスタム データ型を含む) を実装するだけの場合はどうなるでしょうか。ostream から得られる機能はどれですか?
私が望むのは ostream から派生したクラスであると仮定すると、ostream クラスと streambuf クラスの関係を理解するためのガイダンスが必要です。どちらを実装する必要がありますか? いくつかのサンプルを見ると、ostream から派生させる必要はまったくなく、ostream コンストラクターにカスタム streambuf を与えるだけであることがわかります。本当?それは標準的なアプローチですか?
カスタム streambuf のどの仮想関数を実装する必要がありますか? いくつかのサンプル (このサイト: hereとhere 、およびその他のいくつかを含む) を見てきました。メソッドをオーバーライドするものもあれば、sync
メソッドをオーバーライドするものもありますoverflow
。どちらをオーバーライドする必要がありますか? また、stringbuf と filebuf のソース (Visual Studio または GCC) を見ると、これらのバッファ クラスは両方とも streambuf の多くのメソッドを実装しています。
streambuf から派生したカスタム クラスが必要な場合、streambuf から直接ではなく、stringbuf (または他のクラス) から派生する利点はありますか?
「線」について。少なくとも「endl」マニピュレータを使用するクラスのユーザーが新しい行になるようにしたいと思います(つまり、データベースに記録します)。おそらく - 努力次第です - すべての '\n' 文字も新しいレコードと見なす必要があります。カスタム ostream および/または streambuf はそれぞれ誰に通知されますか?