C++ boost::asio中异步操作的处理程序要求
在中指定,C++ boost::asio中异步操作的处理程序要求,c++,boost-asio,boost-bind,C++,Boost Asio,Boost Bind,在中指定,async_accept()的处理程序必须满足以下函数签名: void accept_handler( const boost::system::error_code& ec) { ... } 但是,在day.3示例中,使用boost::bind,可以根据需要指定尽可能多的参数,只要它不超过boost::bind的限制(最多9个参数): 为什么可能呢?我认为即使使用了boost::bind,仍然需要匹配确切的函数签名 请注意handle\u accept()函数以
async_accept()
的处理程序必须满足以下函数签名:
void accept_handler(
const boost::system::error_code& ec)
{
...
}
但是,在day.3
示例中,使用boost::bind,可以根据需要指定尽可能多的参数,只要它不超过boost::bind
的限制(最多9个参数):
为什么可能呢?我认为即使使用了boost::bind
,仍然需要匹配确切的函数签名
请注意
handle\u accept()
函数以及它在async\u accept()
中的用法。完整的代码清单如下。中描述了此概念,它是bind
的工作原理
在本例中,boost::asio::placeholders::error
参数
boost::bind()
是传递给的错误对象的命名占位符
处理者。启动异步操作时,以及如果使用
boost::bind()
,必须仅指定与
处理程序的参数列表。在教程Timer.4中,您将看到
如果用户不需要该参数,则可以省略占位符
回调处理程序
针对您的
async\u accept
问题,将error\u code
参数作为命名参数传递给绑定函数对象。但是,您不需要使用该参数。如上段所述,可以省略。还可以提供其他参数,这可以为处理程序提供有关触发它的异步操作的更多信息。我在这里找到了真正的答案:
基本上,真正的函数是在函数调用操作符
()
的基础上调用的。bind创建一个函数对象,假装是一些其他函数的参数所需的函数签名。使用boost::bind,可以将其他信息传递到处理程序中。仔细阅读本指南:(函数对象部分),我发现。谢谢你的回答,虽然它是正确的,但仍然不够。我想知道为什么bind
可以用更少的参数将2个或更多的参数函数转换成所需的函数对象/指针。
class tcp_server
{
public:
tcp_server(boost::asio::io_service& io_service)
: acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
{
start_accept();
}
private:
void start_accept()
{
tcp_connection::pointer new_connection =
tcp_connection::create(acceptor_.get_io_service());
acceptor_.async_accept(new_connection->socket(),
boost::bind(&tcp_server::handle_accept, this, new_connection,
boost::asio::placeholders::error));
}
void handle_accept(tcp_connection::pointer new_connection,
const boost::system::error_code& error)
{
if (!error)
{
new_connection->start();
}
start_accept();
}
tcp::acceptor acceptor_;
};