C++ iostream

最近 iostream をいじってて今こいつを派生させて ( ある程度 ) 好みのものを作ることが出来るということがわかってきたんだけどいざ使ってみようとするとんー、もしかしてこれ仕組みとして失敗してね ? という点がいくつか出てきた。とりあえずおれの理解としては

  • formatting を司る class である basic_iostream の子孫達が i/o を司る class である basic_stream の子孫達を使役する
  • 自分好みの処理をしたい場合はどちらかもしくは両方を派生させて basic_iostream 側の instance に basic_stream 側の instance を渡す
    • basic_iostream を派生した先で実装した interface を叩く manipulator も同時に定義してやると << で流し込めていい感じ ( なはず )
    • basic_streambuf の派生先では既存の interface を override して自前で用意した buffer を wrap するような code を書けばいい

というあたり ( http://www.kab-studio.biz/Programing/Codian/iostream/01.html の連載そのまま。日本語ではここが一番わかりやすい ) 。で、おれが破綻していると思ったのが以下。

  1. 名前が常識的な概念からかけ離れている
    • iostream に対しての上記の解釈はすんなりと頭に入ったんだけど実際使うときにそれぞれの class の名前が乖離しまくっていて戸惑う、というか事実として through put が下がるので library user へのイヤガラセとしか思えない。 common sence ではない、よなぁ。
  2. 標準入出力へ関連づけられた basic_streambuf の sub class が標準ではないっぽい
    • いやいやそんなはずはと思って手元の VC++ 2008 Express Edition と MinGW gcc 4.4.0 の include の中身検索してみたんだけど *stream な file の中にそれっぽいものがなかった。上記連載の http://www.kab-studio.biz/Programing/Codian/iostream/06.html の一番最後の段落では提供してる vendor もあるという書き方がされているので ( 引用とか面倒だからしない ) 標準で規定されていないものということなんだろう。
    • これがないと何が困るのかというと basic_iostream だけを派生してもそれを使って標準入出力ができないわけで例えば標準出力と file への書き込みを同列に扱えないというオチになるわけで何のための polymorphism か理解に苦しむ結果になるわけで。ついでにいうと iostream まわりの理解をするための resource もバカにならないので結局使えないでは困るどころではないわけで。
    • いやまぁ好意的に解釈するなら basic_stream を派生させた class 内で printf() やら scanf() やらを使って自分で作れということなんだろうけど。好意的じゃなく解釈するなら標準で処理系による差異を吸収することができなかったということなんだろうなぁ。
  3. type checking が働くので自分で作った型の読み書きがめんどくさい
    • 例えば header / footer を持つ binary file とか。 header / footer は構造体で処理することが多いと思うんだけどそのままでは ofstream に流れていってくれない。最初 C like に fout.write(&header, sizeof(header)); と書いたら怒られたのでちょっと考えてから ostream& operator<<(ostream&, const header_struct&); な関数で適宜変換してやるべき ( 構造体に to_string() を仕込んで呼び出すというのが自然かも ) ということに気付いてハッとして good みたいな。
    • ここは C++ に染まっていないと出てこないと言うだけで破綻ではないな。いやでもめんどくさいことには変わりない。いやいや binary でも formatting 、例えば endian 変換とか必要だろ jk そのときに一枚噛ますことができるというのは立派な利点じゃないか。という結論に至った。

最後はなんか違うことになったけどとりあえずこんなところか。結局「ないものは作りましょう。作れますから」に落ち着いた。というのもここらへん理解できているかどうかわからなくなったので自分なりにまとめて問題点を洗い出すために書いた文章だったりするので。「作れますから」と言えるようになっただけでもわかってきたということだな。ただまぁここまで考えないと使えない standard library というのも考え物だよな。純粋に習得 cost が高すぎる。言い換えるとひとを選ぶ言語と言えるかもしれない。少なくともおれにはこれをひとに薦める度胸はないなぁ。

あとなんか調べてみたら今の Boost ( http://www.boost.org/ ) にはここらへん解消する library があるみたいなんだけど ( http://www.boost.org/doc/libs/1_42_0/libs/iostreams/doc/index.html ) 標準でないというのはおれみたいなものぐさにはちとツライので ( compile 時における portability がないとかいつ手に入らなくなるかわからないとか ) 選択肢的にはアレ。