Socket.IO CPP客户端示例(使用std :: bind)

时间:2016-07-23 07:24:07

标签: c++ qt socket.io

我正在尝试按照Any way to make nice antialiased round corners for images in python?指南学习如何在QT上使用Socket.IO CPP客户端。我不明白的是其中一条:

$(document).ready(function(){
  
  $("#bs-navbar-search").hide();
  $('#show').click(function(){
    $("#bs-navbar-search").show();  
  });
  $('#toggle').click(function(){
    $("#bs-navbar-search").toggle();  
  });  
});

应该调用此函数:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="show">Show</button>
<button id="toggle">Toggle</button> //just for a test

<div class="collapse navbar-collapse searchbar-navbar" id="bs-navbar-search">
  <form class="navbar-form navbar-left" role="search">
    <div class="form-group">
    <input type="text" class="form-control" placeholder="Search" id="navbar-search-box">
    </div>
  <button type="submit" class="btn btn-default">Submit</button>
  </form>
</div>

我理解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,_4被传递的原因。

更新: 我对代码进行了修改,将std::placeholder方法移到了全局范围之外(更新了上面的代码)。我遇到了这个错误:

this

所以我检查了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_aux

TIA

1 个答案:

答案 0 :(得分:3)

对于非静态成员类函数,

this需要传递给std::bind,因此代码知道需要调用哪个类的方法。

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