C++ 函数指针向量

C++ 函数指针向量,c++,arrays,vector,function-pointers,C++,Arrays,Vector,Function Pointers,我正在尝试编写一个Gameboy模拟器,我想使用函数指针向量来调用正确的函数,而不是执行一个长的switch语句 例如,如果程序计数器指向0x00(内存中),向量的第一个元素是NOP,因此调用void NOP(); 但我不知道如何调用这些函数 Z80.h 这句话: fmap[opcode] 为您提供指向成员函数的指针。你不能只调用它-它也需要类实例。但实际上,您是从类方法本身调用它-因此这个就是您要查找的实例: (this->*fmap[opcode])(); 请注意,如果要避免这种语

我正在尝试编写一个Gameboy模拟器,我想使用函数指针向量来调用正确的函数,而不是执行一个长的switch语句

例如,如果程序计数器指向0x00(内存中),向量的第一个元素是NOP,因此调用void NOP(); 但我不知道如何调用这些函数

Z80.h

这句话:

fmap[opcode]
为您提供指向成员函数的指针。你不能只调用它-它也需要类实例。但实际上,您是从类方法本身调用它-因此
这个
就是您要查找的实例:

(this->*fmap[opcode])();
请注意,如果要避免这种语法,并且使用C++11,则可以将
fmap
改为
std::function
的向量,并对其进行初始化:

fmap = { std::bind(&Z80::NOP, this),    // or [this](){ this->NOP(); }
         std::bind(&Z80::LDBCnn, this), // etc.
         std::bind(&Z80::LDBCmA, this)};
这将让你真正做到:

fmap[opcode]();

我不完全确定在这种情况下使用函数指针是否比使用大型switch语句更好

但是,不能调用成员函数的原因是没有将对象传递给该函数

你需要这个

(this->*fmap[opcode])();
另一种选择是使用静态/自由函数指针,如下所示:

 void (*function_t)(Z80& self); 
并称之为:

 fmap[opcode](this). 

[或者使用
std::function
std::bind
,这涵盖了相当(有意地,显然地)丑陋的语法]

指向成员函数的指针与指向非成员函数的指针不同,您必须记住这一点,为了帮助解决这个问题,我建议您阅读和。至于为什么成员函数与非成员函数不同,这是因为在成员函数中,
这个
指针实际上是一个隐藏的隐式第一个参数。这意味着,当您跳过Intellisense问题,构建并运行代码时,您将有,因为在调用成员函数时,您没有提供隐式
指针。不过,我可以想象这会非常缓慢。@LightnessRacesinOrbit从未计时,所以不知道。关于始终分析代码的常见警告适用。为了完整起见,把它作为一个选项扔出去从直觉上看,开关的建议似乎是最快的,但谁知道呢:)我已经编写了一些指令模拟器和类似的东西,或者使用了开关,或者基本函数指针——不确定函数和绑定解决方案中有多少额外开销——在一个好的编译器实现中,对于那些不清楚什么是
->*
运算符以及为什么在
(此->*fmap[opcode])()中需要额外的括号的人,请阅读@LightnessRacesinOrbit:请解释为什么这会非常慢?
(this->*fmap[opcode])();
 void (*function_t)(Z80& self); 
 fmap[opcode](this).