|
35 | 35 | #include <functional> |
36 | 36 | #include <stdexcept> |
37 | 37 |
|
| 38 | +// compatibility with C++17 deprecation of result_of |
| 39 | +#if __cplusplus >= 201703L |
| 40 | +// std::invoke_result_t should be used from C++17 onwards, but is not available in C++14 and earlier |
| 41 | +template<class F, class... Args> |
| 42 | +using threadpool_result_t = std::invoke_result_t<F, Args...>; |
| 43 | +#else |
| 44 | +// std::result_of should be used on C++14 and earlier, but is deprecated in C++17 |
| 45 | +template<class F, class... Args> |
| 46 | +using threadpool_result_t = typename std::result_of<F ( Args... )>::type; |
| 47 | +#endif |
| 48 | + |
38 | 49 | class CThreadPool |
39 | 50 | { |
40 | 51 | public: |
41 | 52 | CThreadPool() = default; |
42 | 53 | CThreadPool ( size_t ); |
43 | 54 | template<class F, class... Args> |
44 | | - auto enqueue ( F&& f, Args&&... args ) -> std::future<typename std::result_of<F ( Args... )>::type>; |
| 55 | + auto enqueue ( F&& f, Args&&... args ) -> std::future<threadpool_result_t<F, Args...>>; |
45 | 56 | ~CThreadPool(); |
46 | 57 |
|
47 | 58 | private: |
@@ -87,9 +98,9 @@ inline CThreadPool::CThreadPool ( size_t threads ) : stop ( false ) |
87 | 98 |
|
88 | 99 | // add new work item to the pool |
89 | 100 | template<class F, class... Args> |
90 | | -auto CThreadPool::enqueue ( F&& f, Args&&... args ) -> std::future<typename std::result_of<F ( Args... )>::type> |
| 101 | +auto CThreadPool::enqueue ( F&& f, Args&&... args ) -> std::future<threadpool_result_t<F, Args...>> |
91 | 102 | { |
92 | | - using return_type = typename std::result_of<F ( Args... )>::type; |
| 103 | + using return_type = threadpool_result_t<F, Args...>; |
93 | 104 |
|
94 | 105 | auto task = std::make_shared<std::packaged_task<return_type()>> ( std::bind ( std::forward<F> ( f ), std::forward<Args> ( args )... ) ); |
95 | 106 |
|
|
0 commit comments