我制作了一个功能图。所有这些函数都是无效的并且接收单个字符串参数。
代码:
void f1(string params){...}
void f2(string params){...}
void f3(string params){...}
map<string , void*> funcMap;
funcMap["f1"] =(void*)&f1;
funcMap["f2"] =(void*)&f2;
funcMap["f3"] =(void*)&f3;
我如何调用函数? 我尝试了下一个代码,但id不起作用:
void (*func)(string) = &funcMap[commandType];
func(commandParam);
我收到此错误消息:
Server.cpp:160:46: error: cannot convert ‘void**’ to ‘void (*)(std::string) {aka void (*)(std::basic_string<char>)}’ in initialization
答案 0 :(得分:16)
typedef void (*pfunc)(string);
map<string, pfunc> funcMap;
funcMap["f1"] = f1; //and so forth
然后致电:
pfunc f = funcMap[commandType];
(*f)(commandParam);
一般来说,为什么要扔掉类型安全?如果它是函数指针的映射,则将其声明为一个。
答案 1 :(得分:2)
为什么不将它们作为单独的类。
然后将方法设为虚拟。
然后,您可以在字符串和基类之间建立映射。
即
class Someoperation
{
virtual void Doit() = 0;
};
map<string, Someopertion> ops;
然后
class MyOp : public Someoperation
{
void Doit() { /* Some code here */}
};
只需添加对象
ops["Hello"] = MyOp();
然后调用它
ops["Hello"].Doit();
答案 2 :(得分:0)
&funcMap[commandType]
只需删除&
即可。您的编译错误在这里很有用。右边有一个void**
因为你拿了一个函数指针的地址。你不希望有两级间接。