@@ -155,23 +155,39 @@ namespace traits {
155155 * @brief function (class) signature type trait
156156 *
157157 *****************************************************************************/
158+ #if defined(__cpp_lib_is_invocable)
158159template <class Fn , class Ret , class ... Args>
159160constexpr auto
160161check_is_callable (int ) -> decltype(
161162 std::declval<Fn>()(std::declval<Args>()...),
162163 std::integral_constant<bool,
163- std::is_same<Ret,typename std::result_of <Fn( Args...) >::type>::value>{} );
164+ std::is_same<Ret,typename std::invoke_result <Fn, Args...>::type>::value>{} );
164165
165- template <class , class , class ... >
166+ template <class Fn , class Ret >
166167constexpr auto
167- check_is_callable (long ) -> std::false_type;
168+ check_is_callable_without_arg (int ) -> decltype(
169+ std::declval<Fn>()(),
170+ std::integral_constant<bool,
171+ std::is_same<Ret,typename std::invoke_result<Fn>::type>::value>{} );
172+ #else
173+ template <class Fn , class Ret , class ... Args>
174+ constexpr auto
175+ check_is_callable (int ) -> decltype(
176+ std::declval<Fn>()(std::declval<Args>()...),
177+ std::integral_constant<bool,
178+ std::is_same<Ret,typename std::result_of<Fn(Args...)>::type>::value>{} );
168179
169180template <class Fn , class Ret >
170181constexpr auto
171182check_is_callable_without_arg (int ) -> decltype(
172183 std::declval<Fn>()(),
173184 std::integral_constant<bool,
174185 std::is_same<Ret,typename std::result_of<Fn()>::type>::value>{} );
186+ #endif
187+
188+ template <class ,class ,class ...>
189+ constexpr auto
190+ check_is_callable (long ) -> std::false_type;
175191
176192template <class ,class >
177193constexpr auto
0 commit comments