SSブログ

[C++11][Boost] boost::asio::io_serviceを別スレッドでrunする [C++11]

久しぶりにやっていたらハマったのでメモ。
boost::asio::io_service::run()メソッドが引数の違いでオーバーロードされているので、
メンバ関数ポインタの型推論がメンドウなことになっています。
以降、
boost::asio::io_service io;
とオブジェクトが宣言されているとします。

1.できそうで出来ないパターン
 io_service::run()の型推論が出来ずにビルドエラーになってしまう。
// ビルドエラーになる
std::thread th( &boost::asio::io_service::run, &io );

2.メンバ関数の型を明示すればOKだが…
 だがしかし、こんなこといちいち書いていられない。
 (長いし読みづらい)
// これは書きたくない
std::thread th(
  (std::size_t
    (boost::asio::io_service::*)())
        (&boost::asio::io_service::run),
   &io ); 

3.boost::bindでバインドすると、なぜか推論してくれる。
 boost::bindとstd::bindが混在すると美しくないけれどそれでもよければ?
// boost::bindは推論できる
std::thread th(
  boost::bind(&boost::asio::io_service::run,
                   &io) ); 
 error_codeの引数有り版でもOK。すげえなboost::bind
// 引数有り版でも推論できる
boost::system::error_code ec;
std::thread th(
  boost::bind(&boost::asio::io_service::run,
                   &io,
                   std::ref(ec)) ); 

4.ちなみにstd::bindでバインドは?
// std::bidは?
std::thread th( std::bind(&boost::asio::io_service::run, &io) ); 
 結果はNG! ううむむ。
 もちろん、型を明示してstd::bindでバインドすればビルドが通りますが、
 まったくもって意味が無いですね。

5.ところで、boost::threadは推論してくれるのでしょうか?
// boost::bidは?
boost::thread th( &boost::asio::io_service::run, &io ); 
 これも結果はNG! boost::bindはできるのに〜

6.C++11ならラムダ式にしてしまうほうが簡単かも?
// 個人的にはこれが推し
std::thread th( [&io] { io.run(); } ); 

nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。