我想創建一個菜單句柄來代替這樣的結構:創建具有升壓綁定一個菜單句柄/功能
void MyClass::handleMenu(MenuID id) {
switch (id) {
case option1: doFunction1(); break;
case option2: doFunction2(true); break;
case option3: memberVariable->doOtherFunction(); break;
}
}
隨着菜單項的數量的增加,有switch語句,所以我想切換到一個機制,在該機制中菜單是通過響應菜單通知調用的一些功能對象來設置的。某些函數可能會採用其他參數(在安裝時已知),有些函數可能會調用成員函數。
我有一種感覺,它應該是這個樣子:
void MyClass::setupMenu() {
std::map<MenuID, boost::function<void()>> idMap;
idMap[option1] = boost::bind(&MyClass::doFunction1, _1, this);
idMap[option2] = boost::bind(&MyClass::doFunction2, _1, this, true);
idMap[option3] = boost::bind(&MemberClass::doOtherFunction, _1, memberVariable);
}
void MyClass::handleMenu(MenuID id) {
auto f=idMap[id];
f(); // invoke callback
}
但是,我不能得到boost::function
類型和bind
調用的正確組合。也許由於某些函數可能會返回一個值,這很複雜,但是在菜單處理代碼中,我們並不關心這個,我們可以將其視爲無效。編譯器錯誤往往出現在將bind
的結果插入到映射中的調用中。我錯過了一個更簡單的方法來做到這一點?
編輯:
@坦率的方式工作,但我發現了一個問題,我沒有預料到的:如果你想通過代碼介入調試器來查找得到由該菜單項,然後執行該功能這是相當困難的,因爲在進入實際的函數調用之前,您必須進入和退出boost::bind
代碼的幾個層。調試人員沒有完全跟上boost和tr1的流血邊緣,這真令人遺憾。
刪除'_1'。他們將代表一個函數(至少)1個參數。您的定義idMap不使用任何參數。 – dornhege
其實,可以用'mem_fun'(或'mem_fn')來簡化嗎? –