2016-07-23 6 views
0

Ich versuche, this Guide zu folgen, um zu lernen, Socket.IO CPP-Client auf QT zu verwenden. Was ich nicht verstehe, ist eine dieser Linien:Socket.IO CPP-Client-Beispiel (Verwendung von Std :: Bind)

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

Welche soll diese Funktion aufzurufen:

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

Ich verstehe, dass std::bind(&MainWindow::OnNewMessage ist der Name der Funktion und _1,_2,_3,_4 sind die std::placeholder Objekte aber was ich nicht verstehe ist, warum das zweite Argument this übergeben wird.

UPDATE: ich mit dem Code gebastelt ein wenig, bewegt die onNewMessage Methode außerhalb in globalen Bereich (den oben stehenden Code aktualisiert). Ich lief in diesen Fehler:

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

Und hier ist die Erklärung von event _listener_aux in einer separaten Header-Datei in der Klasse socket selbst:

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

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

So ich die Methode Erklärung on geprüft

TIA

+0

Ihr Problem hat nichts mit der Socket-Programmierung zu tun, aber wie 'std :: bind' verwendet werden soll, wenn eine nicht-statische Member-Funktion aufgerufen wird. Wenn Sie den Titel Ihres Beitrags geändert hätten, hätten Sie sicherlich viel schneller eine Antwort erhalten. – PaulMcKenzie

+0

Siehe [Dokumentation und Beispielprogramm] (http://en.cppreference.com/w/cpp/utility/functional/bind) – PaulMcKenzie

+0

@PaulMcKenzie Ich sah das Beispielprogramm und sie tun es ohne Klassen für 'f1'. Das verwirrt mich. –

Antwort

2

this muss für nicht statische Elementklassenfunktionen an std::bind übergeben werden, damit der Code weiß, welche Klassenmethode aufgerufen werden muss.

In diesem Fall ist this die aktuelle Klasse, aber Sie könnten den Zeiger einer anderen Klasse haben und er würde seine OnNewMessage Funktion aufrufen.

+0

Ich sah das Dokument von 'std :: bind' hier http://en.cppreference.com/w/cpp/utility/functional/bind und sie tun es ohne Klassen .. Das ist was mich verwirrt –

+0

@AkashAggarwal Are you Bist du sicher, dass du das Beispielprogramm sorgfältig liest? Es gibt dort ein klares Beispiel (siehe '// Binde an einen Zeiger auf die Member-Funktion') – PaulMcKenzie

+0

@AkashAggarwal std :: bind mit Member-Klasse Funktion wird dort mit' struct Foo' angezeigt. Für Zeiger auf Elementfunktionen müssen Sie den Zeiger an die Klasse selbst übergeben, damit der Code weiß, welche Klassenfunktion aufgerufen werden muss. Ich habe meine Antwort ein wenig geklärt. – tambre