我试图在C ++中为一个变量分配一个非静态函数。
我有两个函数,onMessageReceived
和enableCommand
。
以下是定义:
NetworkUtil.h:
class NetworkUtil{
public:
std::function<void(char* message)> onMessageReceived;
void enableCommand(char* cmd);
private:
// some private variables
}
NetworkUtil.cpp:
void NetworkUtil::enableCommand(char* cmd) {
if (strcmp(cmd, "INIT_ACK") == 0){
mCreateEnabled = true;
}
else if (strcmp(cmd, "START_ACK")){
mStartEnabled = true;
}
else{
std::cerr << "Unknown Command: " << cmd << std::endl;
}
}
这是一个为变量分配函数的程序:
void NetworkUtil::onMessage(WebSocket* ws, const WebSocket::Data &data)
{
// not working
onMessageReceived = &(NetworkUtil::enableCommand);
// not working either
onMessageReceived = std::bind(&NetworkUtil::enableCommand, data.bytes);
}
我试过了两个,但没有他们正在工作。我可以获得一些关于为变量分配非静态函数的建议吗?
答案 0 :(得分:1)
尝试这样做:
onMessageReceived = std::bind(&NetworkUtil::enableCommand, this, _1);
答案 1 :(得分:0)
由于您正在使用std::function
(因此C ++ 11或更高版本),我认为您可以尝试lambda functions:
// Create a local variable for capturing purposes.
// You must make sure the source data is never outlived by the callback
// to avoid the "use after free" scenario.
auto bytes = data.bytes;
onMessageReceived = [=](char * message) { this->enableCommand(bytes); };
=
表示通过闭包值(包括this
指针的值)捕获实际使用的所有内容,并且由于使用了type erasure您可以将其分配给与签名兼容的std::function
。