【发布时间】:2016-04-07 11:01:56
【问题描述】:
我尝试使用 C++11 的 function 映射到类方法。
C-Style 函数指针:
方法:
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::function 是另一回事。您的原始代码仅存储成员函数指针。 std::function 要求成员函数指针绑定到类的实例。
-
如果函数 MyMethod 使用了一些内部状态,你可能需要 bind 它,或者使用 lambda。但正如@bolov 所说,如果它有效,你不应该修改它。至少因为 std::function 会给它带来运行时开销,所以就这样吧。
-
您在此处展示的两张地图用于完全不同的目的。一个持有指向成员函数的指针,这需要调用实例;另一个是完全绑定函数对象的容器。您想在新方法中存储绑定函数吗?
-
mapIdToMethod.insert(std::make_pair(2, &MyClass::MyMethod));在 c++11 中可以重写为mapIdToMethod.emplace(2, &MyClass::MyMethod);。
标签: c++ function c++11 dictionary member-function-pointers