33
44#include < future>
55#include < thread>
6-
6+ # include < type_traits > // for std::invoke_result/result_of
77#include " async_utils.h"
88
99namespace unigd
@@ -16,13 +16,21 @@ void ipc_close();
1616void r_thread_impl (function_wrapper &&f);
1717
1818template <typename FunctionType>
19+ #if defined(__cplusplus) && __cplusplus >= 201703L
20+ std::future<typename std::invoke_result_t <FunctionType>>r_thread (FunctionType f)
21+ #else
1922std::future<typename std::result_of<FunctionType()>::type>r_thread (FunctionType f)
23+ #endif
2024{
21- typedef typename std::result_of<FunctionType ()>::type result_type;
22- std::packaged_task<result_type ()>task (std::move (f));
23- std::future<result_type>res (task.get_future ());
24- r_thread_impl (std::move (task));
25- return res;
25+ #if defined(__cplusplus) && __cplusplus >= 201703L
26+ typedef typename std::invoke_result_t <FunctionType> result_type;
27+ #else
28+ typedef typename std::result_of<FunctionType ()>::type result_type;
29+ #endif
30+ std::packaged_task<result_type ()>task (std::move (f));
31+ std::future<result_type>res (task.get_future ());
32+ r_thread_impl (std::move (task));
33+ return res;
2634}
2735
2836}// namespace async