映射到方法c++11
Map to method c++11
我试图使用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;
您可以以与插入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*
且不返回任何内容的成员函数,,但前提是您已经有了要在其上构造调用的对象。您可以使用bind
:
MyClass mc;
foo.insert(make_pair(2, bind(&MyClass::MyMethod, mc, placeholders::_1)));
实时示例
相关文章:
- C++11 迭代向量的新方法?
- C++11:模板方法的模板函数调用无法编译?
- 在 C++11 中字符串化变量名称的替代方法
- C++11 原子<>:只能使用提供的方法读取/写入?
- 基本加密和解密方法不起作用 C++ 11.
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- 将方法作为模板化参数传递 C++11
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- C++11 重载方法,并转发到唯一方法
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- 在C 11或更高版本中,是否可以通过Lambda来实现单方法纯Virtual C 接口
- C 11中的标准方法是什么,可以访问std :: vector中元素n的指针
- C++11可变参数模板方法完全影子基类方法
- 在 C++11 中表示日内时间 HH:MM:SS 的最佳方法是什么?
- C++11 纯虚拟类的朋友无法访问私有方法
- C 11魔术静态在Visual Studio 2012中的解决方法
- 不能和正确的方法来声明类成员 c++11 中的 int 数组数组
- 返回类型的C++11 方法模板专用化
- 标准的c++11方法删除一个类型的所有指针
- 可移植的c++ 11方法,同时等待套接字和bool变量