Я пишу приложение, которое использует boost::asio
. async_receive
(или async_read
) у Asio всегда отображается с использованием объекта boost::bind
, заданного для обратного вызова:
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));
Это прекрасно, но я бы не хотел воссоздавать объект связывания после каждого вызова обратного вызова. Вместо этого я хотел бы создать объект, скажем, в конструкторе моего класса и передать его async_receive.
Проблема в том, что я не знаю, как объявить этот объект в качестве члена класса. Все, что я знаю, это авто, и оно явно не будет работать в классе.
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?
...
};
Примечание. Это может быть преждевременной оптимизацией, но я все же хотел бы знать, как объявить объект связывания без auto.