gpt4 book ai didi

c++ - 在 C++ 中创建函数指针的跳转表

转载 作者:行者123 更新时间:2023-11-28 07:18:05 25 4
gpt4 key购买 nike

我正在尝试用 C++ 创建一个函数指针数组,我可以将其用作跳转表。这些功能都是原型(prototype)化的

void(unsigned char*, int, int)

所以我想我会做

typedef void (*func)(unsighed char*, int, int);

然后

func tfunc[256];

然后像这样设置各个元素:

tfunc[0]=func01;

但随后我得到“函数调用缺少参数列表;使用‘&myclass::func01’”

但是当我尝试的时候

tfunc[0]=&myclass::func0;

我收到“错误 C2440:‘=’:无法从‘void (__thiscall myclass::*)(unsigned char *,int,int)’转换为‘myclass::tfunc’1> 没有可以进行这种转换的上下文

我很困惑。

我想我通过在 header 中添加 MyClass::来修复它:tyepdef void (MyClass::*func...);

最佳答案

可以使用std::function<void(unsigned char*, int, int)>为您的函数数组并使用 std::bind() 适本地绑定(bind)您的对象:

using namespace std::placeholders;
std::function<void(unsigned char*, int, int)> tfunc[256];
tfunc[0] = std::bind(&myclass::func0, this, _1, _2, _3);

使用 std::function<Signature>在所有情况下都比使用函数指针更好,因为它允许传递必要的上下文,例如,指向对象的指针。如果你真的只想调用函数而不需要对象,你仍然可以使用 std::function<...>你做了你的func0成员(member)static反而。在那种情况下,您仍然可以使用 std::bind()但这并不是真正需要的:

struct myclass {
static void func0(unsigned char*, int, int);
};
// ...
tfunc[0] = std::bind(&myclass::func0, _1, _2, _3);
tfunc[0] = &myclass::func0;

对于动态多态的爱好者:内部std::function<...>具有继承层次结构,任何具体的初始化都会根据需要实例化派生类。唯一真正的区别是您不需要费力地创建层次结构,并且一些实现会做一些聪明的事情来提高效率。

关于c++ - 在 C++ 中创建函数指针的跳转表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19917992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com