在c ++中为变量赋予非静态函数

时间:2015-07-26 04:40:58

标签: c++

我试图在C ++中为一个变量分配一个非静态函数。 我有两个函数,onMessageReceivedenableCommand。 以下是定义:

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);
}

我试过了两个,但没有他们正在工作。我可以获得一些关于为变量分配非静态函数的建议吗?

2 个答案:

答案 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