2011-12-19 4 views
1

それは、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です。

答えて

1

ここで実際の答えが見つかりました:http://blog.think-async.com/2010/04/bind-illustrated.html 基本的に、実際の関数は関数呼び出し演算子()の基礎と呼ばれています。 boost :: bindは関数オブジェクトを作成し、他のいくつかの関数のパラメータである必要がある関数シグネチャのふりをします。 boost :: bindを使用すると、追加の情報をハンドラに渡すことができます。

1

このコンセプトはtimer tutorial 3に記載されています。その意味はbindです。この例では

boost::bind()から boost::asio::placeholders::error引数は ハンドラに渡されるエラーオブジェクトの名前のプレースホルダです。非同期操作を開始するときに、 boost::bind()を使用する場合は、 ハンドラのパラメータリストに一致する引数のみを指定する必要があります。チュートリアルTimer.4では、 コールバックハンドラでパラメータが必要ない場合、この プレースホルダが省略されることがあります。 async_acceptとあなたの質問に具体的な

error_codeパラメータは、名前のパラメータとしてバインドされた関数オブジェクトに渡されます。ただし、そのパラメータを使用する必要はありません。上記のパラグラフが示すように、それは省略されるかもしれません。追加のパラメータも提供されます。これにより、ハンドラがトリガされた非同期操作に関する詳細情報をハンドラに渡すことができます。

+0

このガイドをよく読んで:http://en.highscore.de/cpp/boost/index.html(機能オブジェクトの部分)、私は理解しました。あなたにお答えいただきありがとうございますが、それは正しいものの、まだ十分ではありません。私はなぜ 'bind'が2つ以上のパラメータ関数をより少ないパラメータで必要な関数オブジェクト/ポインタに変換できるのか不思議に思っていました。 – Amumu

関連する問題