c++ - 函数指针 vector

标签 c++ arrays vector function-pointers

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

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

Z80.h

#include <vector>
using namespace std;

class Z80;
typedef void (Z80::*function_t)();

class Z80
{
public:
  vector<function_t> fmap;
...
...
};

Z80.cpp

Z80::Z80()
{
    fmap = { &Z80::NOP, &Z80::LDBCnn, &Z80::LDBCmA};
}

void Z80::emulateCycle() {
    opcode = memory.readByte(r.pc);
    fmap[opcode]();     <---ERROR
    r.pc++;
}

void Z80::NOP() {

}

这是错误:

IntelliSense: expression preceding parentheses of apparent call must have (pointer-to-) function type

最佳答案

这个表达式:

fmap[opcode]

为您提供指向成员函数的指针。你不能只调用它——它也需要类实例。但你实际上是从类方法本身调用它 - 所以 this是您要查找的实例:

(this->*fmap[opcode])();

请注意,如果您想避免这种语法并且您使用的是 C++11,则可以更改 fmap改为 std::function<void()> 的 vector 并这样初始化它:

fmap = { std::bind(&Z80::NOP, this),    // or [this](){ this->NOP(); }
         std::bind(&Z80::LDBCnn, this), // etc.
         std::bind(&Z80::LDBCmA, this)};

这会让你真正做到:

fmap[opcode]();

关于c++ - 函数指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28138607/

相关文章:

c++ - 这些 C++ 代码片段有什么作用?

c++ - 使用 std::vector::reserve 时,std::sort 顺序是从大到小?

c++ - cblas_dgemv 的意外结果

c++ - 虚拟函数需要多少字节的额外内存?

java - 安卓数组排序

java - 使用随机值创建数组

javascript - 获取给定索引的数组的下一个和上一个元素

c++ - std::vector "move"是否隐式?

在 R 中读取和绘制 esri 形状文件

c++ - 在 C++ 中对对象的输入数组进行排序