@@ -51,15 +51,13 @@ template <typename T> class Future {
5151 }
5252
5353 template <typename F>
54- Future<absl::result_of_t <
55- typename std::decay<F>::type(typename TryWrapper<T>::type)>>
54+ Future<typename function_traits<F>::return_type>
5655 Then (Lauch policy, F &&fn) {
5756 return ThenImpl (policy, (EmptyExecutor *)nullptr , std::forward<F>(fn));
5857 }
5958
6059 template <typename F, typename Ex>
61- Future<absl::result_of_t <
62- typename std::decay<F>::type(typename TryWrapper<T>::type)>>
60+ Future<typename function_traits<F>::return_type>
6361 Then (Ex *executor, F &&fn) {
6462 return ThenImpl (Lauch::Async, executor, std::forward<F>(fn));
6563 }
@@ -146,12 +144,23 @@ template <typename T> class Future {
146144 return std::move (shared_state_->value_ .Value ());
147145 }
148146
149- template <typename R, typename U, typename F, typename Arg>
147+ template <typename R, typename F, typename Arg>
148+ static try_type_t <R> InvokeVoid (F fn, Arg arg, std::true_type/* R is same with void*/ ) {
149+ fn ();
150+ return try_type_t <R>{};
151+ }
152+
153+ template <typename R, typename F, typename Arg>
154+ static try_type_t <R> InvokeVoid (F fn, Arg arg, std::false_type/* R is not void type */ ) {
155+ return try_type_t <R>(fn ());
156+ }
157+
158+ template <typename U, typename F, typename Arg>
150159 static auto Invoke (F fn, Arg arg) ->
151160 typename std::enable_if<!IsTry<U>::value && std::is_same<void, U>::value,
152161 try_type_t<decltype(fn())>>::type {
153- using type = decltype (fn ());
154- return try_type_t <type>(fn () );
162+ using type = decltype (fn ());
163+ return InvokeVoid <type>(fn, arg, std::is_same< void , type>{} );
155164 }
156165
157166 template <typename U, typename F, typename Arg>
0 commit comments