无法将函数指针作为函数参数传递
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_fn
或 std: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
以修改外部变量)
我想将函数指针作为函数参数传递。
这是我的代码:
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_fn
或 std: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 exampletypedef 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
以修改外部变量)