C++ 如何将函数分配给函数指针?

C++ 如何将函数分配给函数指针?,c++,c++11,C++,C++11,我正在编写一个Gameboy模拟器,对于CPU的指令,我在这里使用这个结构(在cpp.hpp中)来存储关于它们的信息。地图用于通过与个人操作码相同的密钥访问所有这些信息: struct指令{ std::string name;//指令的名称 int cycles;//需要执行的时钟周期 int paramNum;//接受的参数数 void*function;//要执行的代码 }; 类Cpu{ 私人: 地图仪器地图; void Cpu::填充指令(void); 指令附加指令(std::string

我正在编写一个Gameboy模拟器,对于CPU的指令,我在这里使用这个结构(在cpp.hpp中)来存储关于它们的信息。地图用于通过与个人操作码相同的密钥访问所有这些信息:

struct指令{
std::string name;//指令的名称
int cycles;//需要执行的时钟周期
int paramNum;//接受的参数数
void*function;//要执行的代码
};
类Cpu{
私人:
地图仪器地图;
void Cpu::填充指令(void);
指令附加指令(std::string,int,int,void*);
公众:
void add_A_n(无符号字符);
}
例如,在cpu.cpp中,我有一个函数要转换为函数指针,以便分配给struct指令的字段。所以我有这个代码:

void Cpu::添加字符(无符号字符){
//身体
}
void Cpu::addInstructions(标准::字符串名称、整数周期、整数参数、void*函数){
指令i={name,cycles,paramNum,function};
返回i;
}
无效Cpu::fillInstructions(){
instrMap[0x80]=Cpu::addInstruction(“添加A,n”,4,0,(void*)和Cpu::ADD_A_n);
}
目标是从内存中获取操作码,然后使用此操作码从映射中检索有关相对指令的信息,最后通过使用开关盒选择正确的指令来执行其功能:

((void(*)(void))instrMap[0x80]。函数)()//对于0参数
((void(*)(无符号字符))instrMap[0x90]。函数)((无符号字符)操作数)//对于1参数
我的目标是将所有函数,甚至是需要一些参数的函数,强制转换为结构中的函数

正确执行相应的功能,但发出警告:

警告:从“void(Cpu::)()”转换为“void”[-Wpmf转换] instrMap[0x80]=Cpu::addInstruction(“添加A,n”,4,0,(void*)和Cpu::ADD_A_n)


我如何解决它,为什么会发生?谢谢

&Cpu::add_A_n
返回A,它与普通函数指针非常不同,不能混合使用。指针指向成员函数的奇怪之处在于,非静态成员函数都需要
这个
实例才能调用函数

在您的情况下,如果像
add\u\n
这样的函数确实不依赖于
,只需将其设置为
静态
,或非成员函数:

class Cpu {
    ...
    static add_A_n(unsigned char);
};

这样,它就不再需要调用
This
,而
&Cpu::add\u\n
就变成了一个普通的函数指针。

我认为这不是实现Cpu仿真器的最佳方法,因为将函数指针作为
void*
传递会失去类型安全性。您是否考虑过使用结构将传递给
virtual
函数的参数存储在表示指令的子类中?未经请求的建议:使用
std::unordered_map
,除非您需要在映射中排序,而您可能不需要。(标准中还有一个平面图,谷歌暂时还没有。)@metal它确实需要C++11,但我可能需要使用它。你也可以从std版本派生的
boost::unordered_map
中获得与C++98兼容的哈希图。