C++ 映射到方法c++;11
我尝试使用C++11的C++ 映射到方法c++;11,c++,function,c++11,dictionary,member-function-pointers,C++,Function,C++11,Dictionary,Member Function Pointers,我尝试使用C++11的函数来映射类方法 C风格的函数指针: 方法: 地图声明: std::map<int, void (MyClass::*)(void*)> mapIdToMethod; std::map<int, function<void(void*)>> mapIdToMethod;//The map declare 方法调用: MyClass mc; (mc.*mapIdToMethod.at(1))(nullptr); 上面的代码已经运行,
函数
来映射类方法
C风格的函数指针:
方法: 地图声明:
std::map<int, void (MyClass::*)(void*)> mapIdToMethod;
std::map<int, function<void(void*)>> mapIdToMethod;//The map declare
方法调用:
MyClass mc;
(mc.*mapIdToMethod.at(1))(nullptr);
上面的代码已经运行,但是如何将其转换为使用C++11的函数
?
我的尝试:
地图声明:
std::map<int, void (MyClass::*)(void*)> mapIdToMethod;
std::map<int, function<void(void*)>> mapIdToMethod;//The map declare
std::map-mapIdToMethod//地图宣布
现在,我如何在这张
地图上插入并调用该方法?可能没有原始地图那么有效,但可能更容易阅读:
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);
std::map-mapIdToMethod;
MapidMethod.emplace(2,[](MyClass&c,void*p){c.MyMethod(p);});
//或者:
使用std::占位符::1;
使用std::占位符::2;
emplace(2,std::bind(&MyClass::MyMethod,_1,_2));
MyClass mc;
第(2)条的地图方法(mc、nullptr);
我也是C风格指针上的函数的粉丝,但重要的是你要认识到void(MyClass::*)(void*)
的模拟是函数
而不是函数
。因此,您可以使用以下方法复制您在MapidMethod
中已经拥有的内容:
map<int, function<void(MyClass&, void*)>> bar;
现在,回答你的问题。鉴于:
map<int, function<void(void*)>> foo;
如果您的代码没有任何问题,请保持原样。如果它没有损坏,就不要修复它的td::函数是另一回事。原始代码只存储成员函数指针。函数将要求成员函数指针绑定到类的实例。如果函数MyMethod使用某些内部状态,则可能需要使用它,或者使用lambda。但正如@bolov所说,如果它有效,就不应该修改它。至少因为std::function会给它带来运行时开销,所以还是别管它吧。您在这里展示的两个映射的用途完全不同。一个持有指向成员函数的指针,这需要调用实例;另一个是用于完全绑定函数对象的容器。是否要在新方法中存储绑定函数?mapIdToMethod.insert(std::make_pair(2,&MyClass::MyMethod))
可以重写为mapIdToMethod.emplace(2,&MyClass::MyMethod)代码>在c++11中。不,它不容易阅读。C++11功能的使用绝对很酷,但一点也不容易阅读。考虑到OP有C++11,你可以使用std::bind
和std::占位符::_1
@juanchopanza:我同意。emplace
将提高可读性并摆脱std::make\u pair
。
map<int, function<void(void*)>> foo;
MyClass mc;
foo.insert(make_pair(2, bind(&MyClass::MyMethod, mc, placeholders::_1)));