Avoid using std::result_of when std::invoke_result is available

Closes #1934
This commit is contained in:
Martin Hořeňovský 2020-05-21 21:39:19 +02:00
parent bed47374ce
commit ddc9f4c61d
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
2 changed files with 5 additions and 6 deletions

View File

@ -12,6 +12,7 @@
#define TWOBLUECUBES_CATCH_DETAIL_COMPLETE_INVOKE_HPP_INCLUDED #define TWOBLUECUBES_CATCH_DETAIL_COMPLETE_INVOKE_HPP_INCLUDED
#include "../../catch_enforce.h" #include "../../catch_enforce.h"
#include "../../catch_meta.hpp"
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
@ -42,20 +43,18 @@ namespace Catch {
return {}; return {};
} }
}; };
template <typename Sig>
using ResultOf_t = typename std::result_of<Sig>::type;
// invoke and not return void :( // invoke and not return void :(
template <typename Fun, typename... Args> template <typename Fun, typename... Args>
CompleteType_t<ResultOf_t<Fun(Args...)>> complete_invoke(Fun&& fun, Args&&... args) { CompleteType_t<FunctionReturnType<Fun(Args...)>> complete_invoke(Fun&& fun, Args&&... args) {
return CompleteInvoker<ResultOf_t<Fun(Args...)>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...); return CompleteInvoker<FunctionReturnType<Fun(Args...)>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);
} }
const std::string benchmarkErrorMsg = "a benchmark failed to run successfully"; const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";
} // namespace Detail } // namespace Detail
template <typename Fun> template <typename Fun>
Detail::CompleteType_t<Detail::ResultOf_t<Fun()>> user_code(Fun&& fun) { Detail::CompleteType_t<FunctionReturnType<Fun()>> user_code(Fun&& fun) {
CATCH_TRY{ CATCH_TRY{
return Detail::complete_invoke(std::forward<Fun>(fun)); return Detail::complete_invoke(std::forward<Fun>(fun));
} CATCH_CATCH_ALL{ } CATCH_CATCH_ALL{

View File

@ -26,7 +26,7 @@ namespace Catch {
int iterations; int iterations;
}; };
template <typename Clock, typename Sig> template <typename Clock, typename Sig>
using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<Detail::ResultOf_t<Sig>>>; using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Sig>>>;
} // namespace Benchmark } // namespace Benchmark
} // namespace Catch } // namespace Catch