Вам нужен
std::bind
для каррирования вашего метода. Нестатический метод обязательно принимает неявно первым параметром указатель на объект, у которого он вызывается. Тот самый this. Т.е. метод без параметров на самом деле является функцией с 1 параметром. Вот этот параметр и нужно зафиксировать, превратив метод в настоящую функцию без параметров.
#include <functional>
#include <iostream>
#include <string>
#include <map>
class Foo {
public:
Foo(std::string msg): m_msg(msg) {}
void event() {
std::cout << m_msg << std::endl;
}
private:
std::string m_msg;
};
int main() {
auto foo = new Foo("Foo");
auto bar = new Foo("Bar");
std::map<std::string, std::function<void ()>> keyEvents = {
{"foo", std::bind(&Foo::event, foo)},
{"bar", std::bind(&Foo::event, bar)}
};
for(auto callback: keyEvents) {
std::cout << callback.first << ":";
callback.second();
}
keyEvents.clear();
delete foo;
delete bar;
return 0;
}