車輪の再発明

とりあえずWindowsでのプロセス生成と標準入出力のつなぎ換えができたが、processの生成とかpipeとかboostに入ってればいいのにな、と思ったらこんなものが。

マジスカと思ったが、まだ議論中みたいですな。コンストラクタでプロセスを生成して、<<と>>で入出力すると。もうちょっとで作っちゃうところだった。危ない危ない。そういえば、Boost.Socketなんてのも議論されてるみたいですね。さて、議論にあがるくらいだから既存のものがあるのかと思ったら、リンクされてる。

まさにこんな感じだ。
それはそうと、wxWindowsって単にGUIを提供するだけじゃなくて、プラットフォーム依存な部分全般を作り込んでいるみたいだ。つまりは、スレッド生成やタイマー、ファイルシステムとかそういったあたり。ちゃんと調べればプロセス生成周りもちゃんとある。いかんせん、stringとかiostream周りも独自設計になっているあたり、ちょっと手を出しづらい。このあたり、標準ライブラリに全部統合されちゃってくれるとうれしいんだけどね。Boost.GUIとかなにすんだろ。
そういえば、OCamlのArgモジュールが使いやすいからC++に移植しようなんて話がありましたが、これはいったい? こんなのあったっけ? Let's boostにも解説見あたらず。例のごとくかなりあれげなソースですね。この辺。

        desc.add_options()
            ("help", "produce help message")
            ("compression", po::value(), "set compression level")
        ;

なるほど、add_options()が関数オブジェクトを返して、その関数オブジェクトはoperator()で再び関数オブジェクトへの参照を返すのか。うーん、なるほど。おもいつかんかった。

exec-stream

こんな感じか。なかなか便利。

#include 
#include 
#include 

int main()
{
  try {
    exec_stream_t es("cat", "");
    es.in() << "hoge" << std::endl;
    std::string str;
    es.out() >> str;
    std::cout << "success:" << str << std::endl;
  } catch (std::exception const & e) {
    std::cerr << "error: "  <<  e.what()  <<  "\n";
  }
}

似たようなライブラリは他にもあるみたいですね。
そういえば、OCamlなら。。。もっと楽だ。unix.cmaと一緒にコンパイルしないといけません。

let in_c, out_c = Unix.open_process "cat" in
output_string out_c "hoge\n";
flush out_c;
let s = input_line in_c in
print_string s