Skip to content

Commit f7cffbd

Browse files
fix: fix compile issue in C++23
#see muellan#54
1 parent 2c32b2f commit f7cffbd

1 file changed

Lines changed: 19 additions & 3 deletions

File tree

include/clipp.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,23 +155,39 @@ namespace traits {
155155
* @brief function (class) signature type trait
156156
*
157157
*****************************************************************************/
158+
#if defined(__cpp_lib_is_invocable)
158159
template<class Fn, class Ret, class... Args>
159160
constexpr auto
160161
check_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>
166167
constexpr 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

169180
template<class Fn, class Ret>
170181
constexpr auto
171182
check_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

176192
template<class,class>
177193
constexpr auto

0 commit comments

Comments
 (0)