它在boost::asio document,对于async_accept()
处理程序必须满足下列函数签名规定:处理程序要求
void accept_handler(
const boost::system::error_code& ec)
{
...
}
然而,在Daytime.3
例如,使用boost ::绑定,该处理器可以被指定为按需要很多参数,只要不超过boost::bind
的限制(这是最大9个参数):
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_;
};
为什么这可能吗?我甚至认为与boost::bind
,确切的功能签名仍然必须匹配。
请注意handle_accept()
功能及其如何在async_accept()
中使用。完整的代码清单是here。
通过仔细阅读本指南:http://en.highscore.de/cpp/boost/index.html(函数对象部分),我想通了。谢谢你的回答,虽然这是正确的,但仍然不够。我想知道为什么'bind'可以使用更少的参数将2个或更多参数函数转换为所需的函数对象/指针。 – Amumu 2011-12-19 19:09:25