それは、async_accept()
ためのハンドラは、次の関数のシグネチャを満たす必要がありますboost::asio documentに指定されている:ブースト::バインドを使用して、Daytime.3
例では、しかしはハンドラーの要件
void accept_handler(
const boost::system::error_code& ec)
{
...
}
を、
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_;
};
なぜことが可能である:ハンドラは、それが(最大で9つの引数である)boost::bind
の限界を超えない限り、所望のように多くのパラメータとして指定することができますか? boost::bind
であっても、正確な関数シグネチャはまだ一致している必要があります。
handle_accept()
ファンクションと、それがasync_accept()
でどのように使用されているかに注目してください。完全なコードリストはhereです。
このガイドをよく読んで:http://en.highscore.de/cpp/boost/index.html(機能オブジェクトの部分)、私は理解しました。あなたにお答えいただきありがとうございますが、それは正しいものの、まだ十分ではありません。私はなぜ 'bind'が2つ以上のパラメータ関数をより少ないパラメータで必要な関数オブジェクト/ポインタに変換できるのか不思議に思っていました。 – Amumu