Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 映射到方法c++;11_C++_Function_C++11_Dictionary_Member Function Pointers - Fatal编程技术网

C++ 映射到方法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++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++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)));