我正在编写一个使用 boost::asio
的应用程序。 Asio 的 async_receive
(或 async_read
)始终使用为回调提供的 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));
这非常好,但我不想在每次调用回调后都重新创建绑定(bind)对象。相反,我想在类的构造函数中创建对象,并将其提供给 async_receive。
问题是,我不知道如何将该对象声明为类成员。我只知道 auto,它显然不能作为类成员工作。
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?
...
};
注意:这很可能是过早的优化,但我仍然想知道如何在没有自动的情况下声明绑定(bind)对象。
最佳答案
使用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;
};
...或类似的东西。
关于c++ - 如何将 boost::bind 对象存储为类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757096/