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_;
};