[C++11][Boost] boost::asio::io_serviceを別スレッドでrunする [C++11]
久しぶりにやっていたらハマったのでメモ。
boost::asio::io_service::run()メソッドが引数の違いでオーバーロードされているので、
メンバ関数ポインタの型推論がメンドウなことになっています。
以降、
1.できそうで出来ないパターン
io_service::run()の型推論が出来ずにビルドエラーになってしまう。
2.メンバ関数の型を明示すればOKだが…
だがしかし、こんなこといちいち書いていられない。
(長いし読みづらい)
3.boost::bindでバインドすると、なぜか推論してくれる。
boost::bindとstd::bindが混在すると美しくないけれどそれでもよければ?
4.ちなみにstd::bindでバインドは?
もちろん、型を明示してstd::bindでバインドすればビルドが通りますが、
まったくもって意味が無いですね。
5.ところで、boost::threadは推論してくれるのでしょうか?
6.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(); } );
コメント 0