函数指针向量
vector of function pointers
我正在尝试编写一个 Gameboy 模拟器,我想使用一个函数指针向量来调用正确的函数,而不是执行一个长的 switch 语句。
例如,如果程序计数器指向 0x00(在内存中),则向量的第一个元素是 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]
给你一个指向成员函数的指针。您不能只调用它 - 它也需要 class 实例。但是您实际上是从 class 方法本身调用它 - 所以 this
是您正在寻找的实例:
(this->*fmap[opcode])();
请注意,如果您想避免这种语法并且您使用的是 C++11,则可以将 fmap
更改为 std::function<void()>
的向量并因此对其进行初始化:
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])();
另一种选择是使用 static/free 函数指针,如下所示:
void (*function_t)(Z80& self);
并调用它:
fmap[opcode](this).
[或者使用 std::function
和 std::bind
,它们覆盖了相当(显然是故意的)难看的语法]
我正在尝试编写一个 Gameboy 模拟器,我想使用一个函数指针向量来调用正确的函数,而不是执行一个长的 switch 语句。
例如,如果程序计数器指向 0x00(在内存中),则向量的第一个元素是 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]
给你一个指向成员函数的指针。您不能只调用它 - 它也需要 class 实例。但是您实际上是从 class 方法本身调用它 - 所以 this
是您正在寻找的实例:
(this->*fmap[opcode])();
请注意,如果您想避免这种语法并且您使用的是 C++11,则可以将 fmap
更改为 std::function<void()>
的向量并因此对其进行初始化:
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])();
另一种选择是使用 static/free 函数指针,如下所示:
void (*function_t)(Z80& self);
并调用它:
fmap[opcode](this).
[或者使用 std::function
和 std::bind
,它们覆盖了相当(显然是故意的)难看的语法]