Использование boost::bind() и shared_from_this()

419
11 февраля 2017, 07:46

В примере асинхронного tcp-сервера на бусте связывается функция (все это происходит в классе, наследующим enable_shared_from_this):

boost::asio::async_write(socket_, boost::asio::buffer(message_),
         boost::bind(&tcp_connection::handle_write, shared_from_this(),
           boost::asio::placeholders::error,
           boost::asio::placeholders::bytes_transferred));  
...  
void handle_write(const boost::system::error_code& /*error*/,
       size_t /*bytes_transferred*/)   {   }

Почему при вызове boost::bind(...) в ее аргументы передается shared_from_this()? Какой в этом смысл, если все аргументы boost::bind(...) (кроме первого) должны использоваться как аргументы handle_write(...), но в аргументах handle_write(...) нет никаких указателей на классы?

Answer 1

handle_write является функцией-членом, т.е. первым (неявным) параметром принимает указатель this. Этот this, правда уже в форме shared_ptr, а не обычного сырого указателя, связывается с помощью bind с handle_write.

Таким образом, можно сказать, что в async_write выполняется вызов вида:

shared_from_this()->handle_write( /*остальные параметры*/);

Наличие shared_ptr судя по всему требуется из-за асинхронного вызова, т.е. когда функция фактически может "пережить" объект, который она принимает параметром через указатель.

READ ALSO
алгоритм std::move

алгоритм std::move

Испортит ли эта инструкция данные в файле?

355
Оптимизация JOIN запросов

Оптимизация JOIN запросов

Помогите ускорить выборку из базы Mysql При выборке 10 записей уходит 25 секунды!

375