I'm writing an application that uses boost::asio
. Asio's async_receive
(or async_read
) is invariably shown using a boost::bind
object given for callback:
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.data(),
chat_message::header_length),
boost::bind(&chat_session::handle_read_header,
shared_from_this(),
boost::asio::placeholders::error));
That's perfectly nice, but I'd like not to have to recreate the bind object after each call to the callback. Instead, I'd like to create the object, say, in the constructor of my class, and give it to async_receive.
The problem is, I don't know how to declare that object as a class member. All I know is auto, and it obviously won't work as a class member.
class Whatever
{
public:
Whatever()
{
functor = boost::bind(&Whatever::Callback);
}
private:
void Callback()
{
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.data(),
chat_message::header_length),
functor);
}
?? functor; // How do I declare this?
...
};
Note: This may very well be premature optimization, but I'd still like to know how to declare a bind object without auto.
boost::bind is a generalization of the standard functions std::bind1st and std::bind2nd. It supports arbitrary function objects, functions, function pointers, and member function pointers, and is able to bind any argument to a specific value or route input arguments into arbitrary positions.
_1 is a placeholder. Boost. Bind defines placeholders from _1 to _9 . These placeholders tell boost::bind() to return a function object that expects as many parameters as the placeholder with the greatest number.
Use boost::function
:
class Whatever
{
public:
Whatever()
{
functor = boost::bind(
&chat_session::handle_read_header,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
);
boost::asio::async_read(
socket_,
boost::asio::buffer(
read_msg_.data(),
chat_message::header_length
),
functor
);
}
private:
boost::function<void(const error_code, const size_t)> functor;
};
... or something like that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With