Я пытался работать на код ниже, но программа аварий:Каков наилучший способ передать функцию обратного вызова на std :: map?
#include <iostream>
#include <string>
#include <map>
using namespace std;
typedef void (*callBackMethod)(string);
class CTest
{
private:
map<string, callBackMethod> mapMethod;
void testMethod(string msg)
{
cout << msg << endl;
}
public:
CTest()
{
addFunction("AA", (callBackMethod) &CTest::testMethod);
}
void addFunction(string funName, callBackMethod methodName)
{
mapMethod[funName] = methodName;
}
callBackMethod getMethod(string funName)
{
auto fun = mapMethod.find(funName);
if(fun == mapMethod.end()) { return nullptr; }
return fun->second;
}
void runFunction(string funName)
{
getMethod(funName)("test");
}
};
int main()
{
CTest test;
test.runFunction("AA");
return 0;
}
У меня есть требование, когда мне нужно передать частные методы на карте. Программа компилируется с предупреждением:
converting from 'void (CTest::*)(std::__cxx11::string) {aka void (CTest::*)(std::__cxx11::basic_string<char>)}' to 'callBackMethod {aka void (*)(std::__cxx11::basic_string<char>)}'
И когда я выполняю это, он падает.
Когда я перемещаю метод обратного вызова вне класса, он работает. Мое требование состоит в том, чтобы сделать этот поток программы (скрыть методы из внешнего вызова, которые необходимо добавить на карту).
Ждем ваших комментариев.
Почему, по вашему мнению, отличная функция-указатель на функцию - это хорошая идея ?! –
@ T.C. Тогда что вы предлагаете? Пожалуйста, измените код, если хотите. – programmer
Возможный дубликат [как передать функцию нестационарного члена в качестве обратного вызова?] (Http://stackoverflow.com/questions/2097738/how-to-pass-a-non-static-member-function-as- a-callback) –