ShowMenu2の実装について

C++側はこんな感じです。


Object ShowMenu2(Context c)
{
CMenuListBox menu;
CMenuListBox::Keymap keymap;
BOOST_FOREACH(SLOT::value_type v, c.callee().proto->slot)
{
UINT mod, code;
keycode::GetKeyModAndCode(v.first.str(), &mod, &code);
keymap[std::make_pair(mod, code)] = boost::bind(gs::make_try_func_call_self_as_method(c, v.second));
}
menu.SetKeymap(&keymap);

return ShowMenuT(c, menu, 0);
}

CMenuListBoxがそれです。MFCのCMenuと同じインターフェイスを持たせることで、ShowMenuと共通の部分をShowMenuTというテンプレート関数にまとめることが可能になっています。calleeのslot(std::map)をBOOST_FOREACHで走査して、得たメソッドをgs::make_try...でファンクタ化し、さらにそれをboost::bindで戻り値をvoidにし、CMenuListBox::Keymapに適合させています。CMenuListBox::Keymapは、

typedef std::map, boost::function > Keymap;
です。
キーボード入力を奪うのはWH_KEYBOARD_LLでやってます。LLじゃないとなんかいまいちな部分が絶対にあるはずなので、そうしておきました。メニューを使わずリストボックスにしたのは、動的なアイテムの追加や削除、選択等がしたかったからです。メニューではどんなにがんばってもできないことがいろいろあります。
ソース*1: MenuListBox, Giraffe+側の実装, include

*1:2008-05-18編集