Пробую boost::beast
примеры, наткнулся на этот кусок кода.
void on_write(beast::error_code ec, std::size_t byte_transferred) {
if (ec) return fail(ec, "write");
http::async_read(m_tcp_stream, m_buffer, m_response, beast::bind_front_handler(
&Session::on_read, shared_from_this()));
}
void on_read(beast::error_code ec, std::size_t bytes_transferred) {
if (ec) return fail(ec, "read");
//std::cout << m_response << std::endl;
write_on_file(m_response);
m_tcp_stream.socket().shutdown(tcp::socket::shutdown_both, ec);
if (ec && ec != beast::errc::not_connected) return fail(ec, "showdown");
}
В частности http::async_read(m_tcp_stream, m_buffer, m_response, beast::bind_front_handler(&Session::on_read, shared_from_this()));
эта строка. Я не могу понять его код. Как это работает. Насколько я понимаю из кода, он возвращает bind_front_wrapper
, который создает внутри себя Handler
и tuple of args
. Но я не понял, как ему удается получить аргументы переданного Handler
в bind_front_handler
, даже если мы не передаем, мы просто передаем shared_ptr
. В этом случае async_read
вызывает метод on_read
. Но мы не передаем никаких параметров, но все равно вызывается, интересно, как?