映射到方法 c++11

Map to method c++11

我尝试使用 C++11 的 function.

映射到 class 方法

C 风格的函数指针:
方法:

void MyClass::MyMethod(void*);

地图声明:

std::map<int, void (MyClass::*)(void*)> mapIdToMethod;

地图插入:

mapIdToMethod.insert(std::make_pair(2, &MyClass::MyMethod));

方法调用:

MyClass mc;
(mc.*mapIdToMethod.at(1))(nullptr);

上面的代码是有效的,但是我怎样才能将它转换为使用 C++11 的 function?
我尝试了什么:
地图声明:

std::map<int, function<void(void*)>> mapIdToMethod;//The map declare

现在,如何在此 map 上插入和调用方法?

可能不如原来的那样高效,但可能更容易阅读:

std::map<int, std::function<void (MyClass&,void*)>> mapIdToMethod;    
mapIdToMethod.emplace(2, [](MyClass& c,void* p){ c.MyMethod(p);});
// alternatively:
using std::placeholders::_1;    
using std::placeholders::_2;
mapIdToMethod.emplace(2,std::bind(&MyClass::MyMethod,_1,_2));

MyClass mc;
mapIdToMethod.at(2)(mc, nullptr);

我也是 function over C 风格指针的粉丝,但重要的是你要认识到 void (MyClass::*)(void*) 的模拟是 function<void(MyClass&, void*)> 而不是 function<void(void*)>。因此,您可以复制 MapIdToMethod 中已有的内容:

map<int, function<void(MyClass&, void*)>> bar;

您可以像插入 MapIdToMethod (bar.insert(make_pair(2, &MyClass::MyMethod)) 一样插入它,但您也可以使用 mem_fn,这是不可能使用的插入到 MapIdToMethod 时:

bar.insert(make_pair(2, mem_fn(&MyClass::MyMethod)));

现在,回答你的问题。给定:

map<int, function<void(void*)>> foo;

您可以插入带有 void* 而没有 return 任何东西的成员函数,但前提是您已经有了要调用的对象建造。您可以使用 bind:

MyClass mc;

foo.insert(make_pair(2, bind(&MyClass::MyMethod, mc, placeholders::_1)));

Live Example