无法将函数指针作为函数参数传递

Unable to pass function pointer as function param

我想将函数指针作为函数参数传递。

这是我的代码:

void AuthServerOpcodes::ValidateAndSetServerOpcode(ServerOpcode serverOpcode, void(*handlerFunc(std::vector<std::byte> data))) {}

这是我想在 ValidateAndSetServerOpcode 中作为第二个参数传递的函数:

void AuthServerOpcodes::Test(std::vector<std::byte> data) {
    std::cout << "all good" << std:end
}

以下是我尝试通过它的方式:

ValidateAndSetServerOpcode(SMSG_LOGIN_REQUEST, &Test);

但这似乎不是正确的方法。当我尝试以这种方式进行时,出现错误:

Cannot initialize a parameter of type 'void (*(*) 
(std::vector<std::byte>))' with an rvalue of type 'void 
(AuthServerOpcodes::*)(std::vector<std::byte>)': different return type 
('void (*)' vs 'void')

为什么会这样,我该如何解决?

你不能那样做。

没有指向该函数的函数指针,因为它是一个成员函数。

您可以改为传递 pointer-to-member-function,或者更好的是 std::function 绑定到捕获 this 指针的 lambda。

只是类型不匹配,您的函数是 AccountManager class 的一个方法, 所以它的签名类似于: static void Login(AccountManager *this, std::vector<..> data);

您可以从 class 中分离函数,更改 handlerFunc 的类型定义或考虑不同的技术,例如 std::mem_fnstd:bind

https://en.cppreference.com/w/cpp/utility/functional/mem_fn https://en.cppreference.com/w/cpp/utility/functional/bind

指向成员的指针必须使用 class 类型限定,因此您需要获取需要使用的指针

ValidateAndSetServerOpcode(SMSG_LOGIN_REQUEST, &AuthServerOpcodes::Test);

但看起来你在之前的编辑中已经尝试过,所以我猜你错误地调用了指向 member 的函数指针。您没有在 Compiler Explorer

上显示 minimal, reproducible example so I can't help you more, please create one. Anyway I've created a compiled example
typedef void (AuthServerOpcodes::*HandlerFunc)(std::vector<std::byte> &);

void AuthServerOpcodes::ValidateAndSetServerOpcode(ServerOpcode serverOpcode,
        HandlerFunc handlerFunc)
{
    std::vector<std::byte> myVector;
    (this->*handlerFunc)(myVector);   // call the hander
}

void FreeStandingFunction(AuthServerOpcodes& opc,
    AuthServerOpcodes::HandlerFunc handlerFunc,
    std::vector<std::byte> &data)
{
    (opc.*handlerFunc)(data);
}

如您所见,必须使用 ->*.* 调用指向成员的指针,并且整个取消引用必须包含在 () 中,因为这些运算符的优先级低于函数呼叫运营商 ()

另见 Function pointer to member function

一些off-topic注:

  • 不要使用像那样太长的行
  • 除非您确实需要保留外部值,否则不要按值传递向量。始终通过引用传递 const std::vector<>&(或删除 const 以修改外部变量)