C++ C++;具有0或1参数的结构中的函数指针

C++ C++;具有0或1参数的结构中的函数指针,c++,function-pointers,C++,Function Pointers,这里我声明了一个结构,我的类中有一个数组 struct instruction { std::string disassembly; unsigned char operandLength; void* execute; }; ... class CPU { private: struct instruction opcodes[256]; void load_n_to_b(unsigned char arg1); //0x06 void l

这里我声明了一个结构,我的类中有一个数组

struct instruction {
    std::string disassembly;
    unsigned char operandLength;
    void* execute;
};

...

class CPU {
private:
    struct instruction opcodes[256];

    void load_n_to_b(unsigned char arg1); //0x06
    void load_c_to_b(); //0x41 

...

}
我已尝试初始化操作码数组,但不断出现“指令”的初始值设定项太多”或从类型“void(*)(unsigned char)”转换为类型“void*”无效的错误。由于函数可以有0个参数或1个参数,所以我不知道如何使它在C++中工作。 我正在初始化它们,如下所示

opcodes[0x06] = instruction{ "LD B, 0x%02X", 1, load_n_to_b };
opcodes[0x41] = instruction{ "LD B, C", 0, load_c_to_b };

您可以在
指令
结构中按住指向
void
的指针。相反,您需要函数指针

void (*execute)() ;

它适用于
load_c_to_b
,因为它的参数也是
void
。但是,我更喜欢
void(*execute)(void*)
,因为如果我需要一个参数,我可以通过强制转换来使用它,否则,请忽略它。

每当您看到
void*
,考虑到你可能有什么不对。@ NeilButterworth,否则你将如何传递具有零点或一个变量的函数指针。函数指针不能保证转换为<代码>虚空*/COD>,反之亦然,所以这是毫无意义的。当你的问题是关于C++时,你可能应该使用函数对象。@ NeilButterworth,你如何做有不同函数签名的函数对象?如果你编写一个简单的CPU模拟器,那么不要使用函数指针。作为一个用FORTRAN77编写了一个相当完整的8080模拟器和开发环境的人来说,我不能转换为src/cpu/cpu.cpp:19:64:错误:从“void()(unsigned char)”到“void()(void*)”[-fpermissive]操作码[0x06]=(指令){“LD B,0x%02X”,1,load_n_to_B}的转换无效@显然你应该学习C/C++,这对两者来说都是一个共同的主题。@GeneralZero你必须将
void load\u n\u改为\b(unsigned char arg1)至<代码>无效荷载至(无效*arg1),并将
无效加载_c_更改为_b()至<代码>无效荷载(无效*)
在没有参数要传递的情况下,传递null:
inst.execute(nullptr)。在有参数要传递的情况下,按其地址传入并在函数中键入cast指针,例如:
unsigned char value=。。。;指令执行(&value)。。。void load_n_to_b(void*arg1){unsigned char arg=*static_cast(arg1);…}
如果要传递多个参数,请通过指针传入
结构。