6

私はboost::asioの例を見ています。私は 例4を見ています

紛らわしいのは、この例の WaitHandler にはシグネチャがあることです。

void プリント (これ)

しかし、async_wait 呼び出しは、そのハンドラーを想定しています。

ハンドラーの関数シグネチャは次のようにする必要があります。

void handler( const boost::system::error_code& error // 操作の結果。);

出典: ブーストのドキュメント

パラメーターの型は関数のシグネチャの一部であるため、上記の例で async_wait が、boost::system::error_code 型ではないパラメーターを持つハンドラーを受け入れるのはなぜですか?

ありがとう。

4

2 に答える 2

12

ご覧のとおり、async_wait メソッドは 1 つのパラメーター (const boost::system::error_code&) を取るハンドラー関数を受け入れます。ただし、Timer.4 の例では、async_wait の呼び出しは次のようにブースト バインドを介して渡されます。

timer_.async_wait(boost::bind(&printer::print, this));

boost::bind は、 thisによって参照されるオブジェクトのクラスprinterのメソッドprintを参照する関数オブジェクトを返します。この関数オブジェクトは、エラー パラメータを指定して async_wait メソッドによって呼び出されます (それが予期されるシグネチャであるため)。しかし、エラー パラメータはバインドによって参照されないため、黙って無視されます。

公式のboost::bind ドキュメントには、boost::bind の詳細が記載されています。記事「Boost Bind ライブラリで C++ プログラムを改善する方法」も参照してください(おそらく他にも多くの記事が利用可能ですが、私はこれが非常に役立つと思いました)。

于 2009-12-21T22:47:58.227 に答える
2

プレースホルダーを使用して、async_wait の呼び出しで、コールバック関数が受け取るパラメーターを指定します。リンク先のページの async_wait 呼び出しのすぐ上の文を確認してください。

print メンバー関数はパラメーターとしてエラー オブジェクトを受け入れないため、boost::asio::placeholders::error プレースホルダーがここで指定されていないことに注意してください。

この例で「プレースホルダー」を検索すると、その方法がわかります。

于 2009-11-22T15:19:12.413 に答える