2016-07-23 75 views
0

我正在尝试关注this指南,了解如何在QT上使用Socket.IO CPP客户端。我不明白的是,这些行之一:Socket.IO CPP客户端示例(使用std :: bind)

auto onm = std::bind(onMessage, _1, _2, _3, _4); 
h.socket()->on("message", onm); 

这是应该调用这个函数:

void OnNewMessage(std::string const& name,message::ptr const& data,bool hasAck,message::ptr &ack_resp) 

我明白std::bind(&MainWindow::OnNewMessage是函数的名称和_1,_2,_3,_4std::placeholder对象但我不明白的是为什么第二个参数this被传递。

UPDATE: 我的代码修修补补一点,在全球范围内(更新上述代码)外侧移动的onNewMessage方法。我就遇到了这个错误:

no matching function for call to 
'sio::socket::on(const char [8], std::_Bind<void (*(std::_Placeholder<1>, 
std::_Placeholder<2>, std::_Placeholder<3>, std::_Placeholder<4>) 
)(const std::__cxx11::basic_string<char>&, 
const std::shared_ptr<sio::message>&, bool, std::shared_ptr<sio::message>&)>&)' 
h.socket()->on("message", onm); 
          ^

所以我检查的on方法声明:

void socket::on(std::string const& event_name,event_listener_aux const& func) 

这里是event _listener_auxsocket类本身就是一个单独的头文件中声明:

typedef std::function<void(const std::string& name,message::ptr const& message,bool need_ack, message::list& ack_message)> event_listener_aux; 

TIA

+0

你的问题与套接字编程无关,但是当调用非静态成员函数时应该如何使用'std :: bind'。如果您更改了帖子的标题,那么您肯定会很快收到答案。 – PaulMcKenzie

+0

请参阅[文档和示例程序](http://en.cppreference.com/w/cpp/utility/functional/bind) – PaulMcKenzie

+0

@PaulMcKenzie我看到了示例程序,并且它们没有为'f1'分类。这就是让我困惑的原因。 –

回答

2

需要将传递给非静态成员类函数std::bind,以便代码知道需要调用哪个类的方法。

在这种情况下,this是当前类,但您可以有另一个类的指针,它会调用它的OnNewMessage函数。

+0

我在这里看到了'std :: bind'的文档http://en.cppreference.com/w/cpp/utility/functional/bind,他们没有类就做了这个。这就是让我困惑的事情 –

+0

@AkashAggarwal你确定你正在仔细阅读示例程序?在那里有一个明确的例子(看'//绑定到指向成员函数的指针) – PaulMcKenzie

+0

@AkashAggarwal std :: bind成员类函数在那里用'struct Foo'展示。对于指向成员函数的指针,您需要将指针传递给类本身,以便代码知道需要调用哪个类的函数。我已经澄清了我的答案。 – tambre