Boost.Phoenix で sleep sort
一時期流行ったアレ。
最初は、Boost.Thread を使った sleep sort を書こうと思っていただけなんですが、気がついたら Boost.Phoenix でガシガシ書いていました。
[ソース]
#include <boost/thread.hpp> #include <boost/phoenix.hpp> #include <boost/function.hpp> #include <boost/typeof/typeof.hpp> #include <iostream> int main(){ namespace phx = boost::phoenix; using phx::local_names::_a; using phx::local_names::_b; using phx::local_names::_v; using phx::local_names::_g; using phx::arg_names::arg1; using phx::arg_names::arg2; BOOST_AUTO(sleep_sort, phx::let( _g = arg1, _v = arg2 )[ phx::for_each(_v, phx::lambda[ phx::bind( &boost::thread_group::create_thread<boost::function<void()> >, _g, phx::lambda(_b = arg1)[ phx::bind( boost::this_thread::sleep<boost::posix_time::seconds>, phx::construct<boost::posix_time::seconds>(_b) ), std::cout << _b << std::endl ] ) ] ) ]); int array[] = {1, 0, 2, 8, 5, 3, 9, 7, 4, 6}; boost::thread_group group; std::cout << "start sleep sort" << std::endl; sleep_sort(group, array); group.join_all(); return 0; }
[出力]
start sleep sort 0 1 2 3 4 5 6 7 8 9
テンプレート関数をそのまま渡せないのが悲しいですね。
create_thread は仕方なく boost::function を使っていてぐぬぬ…。
しかし、Boost.Phoenix で書くとスコープが深いな…。
他にも Boost.Asio でも sleep sort を書いてみたいところ。
[boost]
- ver 1.47.0