映射到方法c++11

Map to method c++11

本文关键字:c++11 方法 映射      更新时间:2023-10-16

我试图使用C++11的function制作一个到类方法的映射。

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);

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

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

您可以以与插入MapIdToMethodbar.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*且不返回任何内容的成员函数,,但前提是您已经有了要在其上构造调用的对象。您可以使用bind:

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

实时示例