2016-07-23 72 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