C++函数指针类未在 GCC 中编译

C++ function pointer class not compiling in GCC?

本文关键字:GCC 编译 函数 指针 C++      更新时间:2023-10-16

我正在尝试创建一个可以容纳并稍后调用函数的类。它将函数与保存函数名称的字符串一起存储在映射中。

我尝试在带有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; 
}

要有一个不带参数并返回 void 的函数指针映射,您需要:

std::map<std::string, void(*)()> functionsMap; 

将模板add_func是没有意义的,因为它只有在使用 ReturnValue = void 实例化时才有效(除非您在其实现中添加了可能不安全的强制转换)。

如果你的代码使用 Visual C++ 进行编译,那是因为 Visual C++ 是宽松的。

您可以将该函数作为参数传递,如下所示:

void add(void * f()){...}

如何在 C 中将函数作为参数传递?

考虑使用 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"; } );