2016-04-07 3 views
1

Я использую C++.
Я пытаюсь сделать карту методам класса.
т.е:
Map to method C++

map<int,void*> mapIdToMethod; 

Метод:

void MyClass::MyMethod(void*); 

То, что я пробовал:

mapIdToMethod.insert(make_pair(1, (void*)&MyClass::MyMethod));//Not compiled 
mapIdToMethod.insert(make_pair(1, (void*)&MyClass::MyMethod()));//Not compiled 

Итак, что лучше, почему это сделать и как?
Спасибо!

* Я не могу с помощью Boost

+2

Зачем использовать 'void *', а не указатель на функцию-член? – songyuanyao

+0

@songyuanyao, что мне нужно заменить вместо void *? – Evyatar

+0

'map :: insert' не принимает двух параметров. Используйте 'make_pair' – Ajay

ответ

5

Вам не нужно использовать void*, просто использовать указатель на функцию-член непосредственно.

std::map<int, void (MyClass::*)(void*)> mapIdToMethod; 

КСТАТИ: Ваше использование std::map::insert неправильно. Вы можете

mapIdToMethod.insert({1, &MyClass::MyMethod}); 

или использовать std::make_pair

mapIdToMethod.insert(std::make_pair(2, &MyClass::MyMethod)); 

EDIT

Примечание вам нужно экземпляр назвать его, например:

MyClass mc; 
(mc.*mapIdToMethod.at(1))(nullptr); 

LIVE

+0

Спасибо! и как я могу вызвать метод?Я пробовал mapIdToMethod.at (1) (NULL), и я получил ошибку синтаксиса – Evyatar

+0

Для этого вам нужен экземпляр. См. Мой обновленный ответ. @Evyatar – songyuanyao

+0

Можете ли вы дать мне, пожалуйста, ответьте также с помощью стиля C++ 11? (с функцией (void (void *)) Спасибо! – Evyatar

4

Синтаксис указателя члена не void*. Попробуйте следующее:

#include <map> 

class MyClass 
{ 
    void MyMethod(void*); 
}; 

std::map<int, void (MyClass::*)(void*)> maps; 

и соответствующим образом изменить подпись функции-члена.

и для получения дополнительной документации, пожалуйста, прочитайте: https://isocpp.org/wiki/faq/pointers-to-members

+0

Спасибо! и как я могу вызвать метод? Я пробовал mapIdToMethod.at (1) (NULL), и я получил ошибку синтаксиса – Evyatar