2009-11-22 16 views
6

私はboost :: asioの例を調べています。私は混乱して何 Example 4Boost :: asio async_waitハンドラシグネチャ

で探しています。この例ではWaitHandler署名

ボイドプリント(この)

を持っている。しかしasync_waitコールはその

ハンドラを期待する、ということです

ハンドラの関数シグネチャは、

である必要があります。

voidハンドラ( const boost :: system :: error_code &エラー//操作の結果。 );

Source: Boost documentation

パラメータタイプは、関数の署名の一部であるため、なぜ上記の例では、async_waitは、そのパラメータの型ブーストではないハンドラ::システム:: ERROR_CODEを受け入れますか?

THanks。

答えて

11

正しく表示されているように、async_waitメソッドは、1つのパラメータ(const boost :: system :: error_code &)を受け取るハンドラ関数を受け入れます。以下のようにTimer.4例では、async_waitの呼び出しは、ブースト結合を介して渡される。

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

ブースト::バインドのクラスプリンタ方法プリントを指す関数オブジェクトを返しますによって参照されるオブジェクト。この関数オブジェクトは、async_waitメソッドによってerrorパラメータとともに呼び出されます(これは、それが期待するシグネチャであるためです)。しかし、エラーパラメータはバインドによって参照されないため、静かに無視されます。

公式boost::bind documentationはboost :: bindの詳細を提供します。記事How the Boost Bind Library Can Improve Your C++ Programsも参照してください(もっと多くの記事がありますが、これは非常に便利です)。

2

プレースホルダを使用して、コールバック関数が使用するパラメータをasync_waitに指定します。

print member関数がエラーを受け付けないので、boost :: asio :: placeholders :: errorプレースホルダはここでは指定されていないことに注意してください。async_wait呼び出しの直前の文をチェックしてください。パラメータとしてのオブジェクト。

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