[英]How can I store a boost::bind object as a class member?
我正在编写一个使用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));
这非常好,但我不想在每次调用回调后重新创建绑定对象。 相反,我想在我的类的构造函数中创建对象,并将其赋予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的情况下声明绑定对象。
使用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;
};
... 或类似的东西。
我想你正在寻找助推功能 。
只要签名正确,您就可以将绑定表达式的结果分配给boost :: function对象。
执行此操作的“标准”方法是使functor
成为std::function
。
如果你真的想存储实际的binder对象,那么查看涉及binder的编译错误消息以找出确切的类型,并尝试使用它们来确定binder对象的实际类型。
boost :: bind的返回类型是boost :: function 。 这是一个使用非常简单的函数的简单示例:
double f(int i, double d) {
cout << "int = " << i << endl;
return d;
}
boost::function<double (int)> bound_func = boost::bind(f, _1, 1.234);
int i = 99;
cout << bound_func(i) << endl;
在您的情况下,该函数具有以下类型:
boost::function<void(const error_code, const size_t)> f;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.