Функции async_xxx основаны на типе обработчика завершения. Обработчик не обязательно должен быть простым «обратным вызовом», и это может быть все, что предоставляет правильную сигнатуру оператора ().
Таким образом, вы должны быть в состоянии сделать что-то вроде этого:
// Warning: Not tested
struct MyReadHandler
{
MyReadHandler(Whatever ContextInformation) : m_Context(ContextInformation){}
void
operator()(const boost::system::error_code& error, std::size_t bytes_transferred)
{
// Use m_Context
// ...
}
Whatever m_Context;
};
boost::asio::async_read(socket, buffer, MyReadHander(the_context));
В качестве альтернативы, вы также можете использовать свой обработчик как простую функцию и связать его на сайте вызовов, как описано в asio tutorial . Пример выше будет тогда:
void
HandleRead(
const boost::system::error_code& error,
std::size_t bytes_transferred
Whatever context
)
{
//...
}
boost::asio::async_read(socket, buffer, boost::bind(&HandleRead,
boost::asio::placeholders::error_code,
boost::asio::placeholders::bytes_transferred,
the_context
));