映射到方法 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)));
我尝试使用 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);
我也是 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)));