Как говорит Крис, ваш findFunc
должен возвращать фактическую функцию:
MyFunction findFunc(string key)
{
const map<string, MyFunction>::const_iterator it = functionMap.find(key);
return it == functionMap.end() ? NULL : it->second;
}
Кроме того, если вы сохраняете только указатель на функцию-член, вы теряете отслеживание реального объекта (так что выможет просто сделать вашу карту статичной!).Возможно, вам также следует сохранить указатель this
объекта, то есть сделать карту следующим образом:
std::map<std::string, std::pair<T*, MyFunction> > functionMap;
В addFunc
вы бы сказали
functionMap.insert(std::make_pair(funcName, std::make_pair(this, function)));
Использование: Предположим it = functionMap.find("key")
.Тогда вы могли бы сказать:
MyClass * const p = it->second.first;
MyFunction f = it->second.second;
p->*f(); // invoke -- yes, it's operator->*() in action