kwsk RT @Cryolite: ふむ, std::istream と std::ostream の双方の役割を果たすものが1つのクラスとして表現されるべき理由はいくつか見つかったけれどより強い理由が欲しいにぇ,状態.
2010-04-15 14:44:36@kikairoya 例えば TCP に対する入出力ストリームだと,やはり入出力双方でエラー状態を共有したいですよにぇ,とか.
2010-04-15 15:30:43@kikairoya あと,単一の streambuf を入出力双方で共有する場合は streambuf の lifetime 管理がしんどくなるよにぇ,とか.ただ,「単一の streambuf を入出力双方で共有する」というのが実際的な場面でどこまで強く望まれるものなのか…….
2010-04-15 15:32:56@Cryolite なるほろ・・・しかしそれならios_baseから菱形継承ではなく、個別に継承させてiostreamから(i|o)streamに委譲するのが素直な気も
2010-04-15 15:37:48@kikairoya はい,それは検討しました.たとえば, iostream に istream &, ostream & への暗黙の変換を定義すれば継承と同等の使い勝手となりますが,
2010-04-15 15:40:51@kikairoya ユーザ定義の iostream を実装する者は,例えば istream, ostream のエラー状態を同期するよう気をつけねばならず,実装の負荷が高いといえます.
2010-04-15 15:41:52@kikairoya あと, tie による ostream => istream のエラー状態同期を双方向に拡張することも検討してみましたが,相互依存関係でかつ lifetime 管理が難しくなるので厳しいかな,と.
2010-04-15 15:43:54現状stream層で管理してるのはバッファとポインタだけでフラグは全部ios_baseでは・・・というところまで考えて、ああだから仮想継承してるのかという結論に落ち着いた
2010-04-15 15:48:28@kikairoya いや, istream / ostream の層が独自に保持している状態って gcount / pcount の値ぐらいで,あとは (例えば streambuf へのポインタなんかもすべて) basic_ios / ios_base が保持してますですよ.
2010-04-15 15:56:14basic_streambuf って controlled input sequence を [持っている|持っていない], controlled output sequence を [持っている|持っていない] の任意の組み合わせを1つの型でやる設計なので,
2010-04-15 15:57:35標準はしっかり考えられて作られてるから、標準より良いものを作ろうと思ったら、現状のデザインを一度崩さないと無理、ってことなのですかねー。少なくともC++では。
2010-04-15 15:59:51さらに,書き込み・読み込みの stream position が常に同じ場所を指すとかいう制約が置かれている場合もあるので,そういう場合には入出力双方で同一の basic_streambuf を「持つ必要がある.」 (e.g. std::filebuf)
2010-04-15 16:01:59@SubaruG Boost.Iostream で良いんではないですか? C++ 標準の入出力インタフェイスへの後方互換も一瞬で提供できますし. http://bit.ly/ctULvk
2010-04-15 16:06:49@SubaruG 例えば, controlled [入|出]力 seq. の有無, associated seq. が入出力で分離しているかいないか,シークできるか,シークが入出力で独立か,が http://bit.ly/a9B1Du の階層では不満とかなら別ですけれど.
2010-04-15 16:11:27Boost.Iostreams おいしいです(^q^) QT @zakkas783: IOstreamを拡張しようとした人ならわかる、Boost.Iostreamのイカレ度。
2010-04-15 16:17:12