| 65 | |
| 66 | template<typename F, class ...ArgTypes> |
| 67 | class thread_data: |
| 68 | public detail::thread_data_base |
| 69 | { |
| 70 | public: |
| 71 | BOOST_THREAD_NO_COPYABLE(thread_data) |
| 72 | thread_data(BOOST_THREAD_RV_REF(F) f_, BOOST_THREAD_RV_REF(ArgTypes)... args_): |
| 73 | fp(boost::forward<F>(f_), boost::forward<ArgTypes>(args_)...) |
| 74 | {} |
| 75 | template <std::size_t ...Indices> |
| 76 | void run2(tuple_indices<Indices...>) |
| 77 | { |
| 78 | |
| 79 | detail::invoke(std::move(std::get<0>(fp)), std::move(std::get<Indices>(fp))...); |
| 80 | } |
| 81 | void run() |
| 82 | { |
| 83 | typedef typename make_tuple_indices<std::tuple_size<std::tuple<F, ArgTypes...> >::value, 1>::type index_type; |
| 84 | |
| 85 | run2(index_type()); |
| 86 | } |
| 87 | |
| 88 | private: |
| 89 | std::tuple<typename decay<F>::type, typename decay<ArgTypes>::type...> fp; |
| 90 | }; |
| 91 | #else // defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD) |
| 92 | |
| 93 | template<typename F> |