しばらくboost.interprocessネタで書いていこう。

前回boost.interprocessでオブジェクトをファイル上に作って遊びましたが、どうも配列も作成できるらしいです。こんな感じで。

static const size_t N = 5;

// N 個の配列として作成
Type* arr = mfile.construct<Type>("Name")[N](Allocator);

// proxyを束縛してから作成
auto proxy = mfile.construct<Type>("Name");
Type* arr = proxy[N](Allocator);

interprocessの当該ドキュメントを見てるとproxyのoperator()にはいくつか変数を渡せるようなのですが、これってもしかしてアロケータだけなのだろうか。make_sharedのように初期化用の引数を与えることができると、結構使い勝手が良いんですが…。
proxyのoperator()は受け取ったパラメータを作成するオブジェクトのコンストラクタにそのまま渡すようです。make_sharedなどと同じ。例えば、interprocess.vectorの初期サイズを10、値を0として作成したい場合には以下の形。

namespace bip = boost::interprocess;

typedef bip::allocator<int, bip::managed_mapped_file::segment_manager> allocator_t;
typedef bip::vector<int,allocator_t> vector_t;

allocator_t const vec_alloc(mfile.get_segment_manager());
vector_t* vec = mfile.construct<vector_t>("Vector")(10,0,vec_alloc);

いちいち型を指定したりしないといけなくて非常に面倒なので型変換演算子とか使って分かりやすくしたいですね。