2016-07-23 1 views
0

Я пытаюсь следовать руководству this, чтобы узнать, как использовать клиент Socket.IO CPP на QT. То, что я не понимаю, это одна из этих линий:Пример клиента CPP-приложения Socket.IO (использование 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,_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 в отдельном файле заголовка в классе socket сам:

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

this необходимо передать 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

Смежные вопросы