我正在尝试创建一个可以保存并稍后调用函数的类。它将函数与一个包含函数名称的字符串一起存储在映射中。
我尝试在使用GCC的Linux上执行此操作,并在"invalid conversion from void(*)() to void *"
functionsMap[nameOfFunction] = func;
这是我到目前为止的整个程序。它还没有完成,但我真的很好奇为什么这将在Visual C ++而不是GCC下编译。如果我做错了或者可能做得更好,请告诉我。谢谢!
#include <iostream>
#include <map>
#include <string>
using namespace std;
class Dyn_Class{
private:
map<string, void *> functionsMap;
public:
Dyn_Class(){}
template<typename ReturnValue>
void add_func( string nameOfFunction, ReturnValue(*func)() ){
functionsMap[nameOfFunction] = func;
}
void remove_func( string nameOfFunction ){
}
Dyn_Class operator()(string nameOfFunction){
}
};
void print(void){
for(int index = 0; index < 9; index++){
cout << index << " ";
}
cout << endl;
}
int main(){
Dyn_Class functionsList;
functionsList.add_func("print", print);
return 0;
}
答案 0 :(得分:2)
要有一个指向函数的指针映射,不需要参数并返回void,你需要:
std::map<std::string, void(*)()> functionsMap;
将add_func
作为模板是没有意义的,因为只有在使用ReturnValue = void
进行实例化时才会有效(除非您在其实现中添加了可能不安全的强制转换)。
如果您的代码使用Visual C ++编译,那是因为Visual C ++是允许的。
答案 1 :(得分:0)
答案 2 :(得分:0)
考虑使用std :: function代替:
class Dyn_Class{
private:
map<string, function<void()> > functionsMap;
public:
Dyn_Class(){}
template<typename FUNC>
void add_func(const string& nameOfFunction, FUNC func){
functionsMap.insert(make_pair(nameOfFunction, func));
}
void remove_func(const string& nameOfFunction ){
}
void operator()(const string& nameOfFunction){
functionsMap[nameOfFunction]();
}
};
好处?使用“function”,您可以使用普通的旧函数指针,可以使用仿函数,也可以使用lambda表达式代替:
DynClass dyn;
dyn.add("print", []() { printf("Say hi"; } );