From 1abb48cb0cac0c67055218ee475dca0c9f7f8c41 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Fri, 28 Nov 2025 12:00:10 +0800 Subject: [PATCH] [libc++][NFC] Simplify SFINAE detections in `weak_result_type.h` For `__has_result_type`, it can be replaced with a variable template `__has_result_type_v`. Note that the pre-existing extraneous `*` used in detection buggy, but it's a functional change to fix it. `false_type` and `true_type` are no longer directly used, so direct inclusion of `<__type_traits/integral_constant.h>` is removed. For `__derives_from_{unary,binary}_function`, it's unnecessary to invent a `__two` type for each specialization. So `void` is used instead. Also, `nullptr` is now used instead of `0`. --- .../include/__functional/weak_result_type.h | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/libcxx/include/__functional/weak_result_type.h b/libcxx/include/__functional/weak_result_type.h index aa462e4d5c56f..4232bdc69dd00 100644 --- a/libcxx/include/__functional/weak_result_type.h +++ b/libcxx/include/__functional/weak_result_type.h @@ -13,9 +13,9 @@ #include <__config> #include <__functional/binary_function.h> #include <__functional/unary_function.h> -#include <__type_traits/integral_constant.h> #include <__type_traits/invoke.h> #include <__type_traits/is_same.h> +#include <__type_traits/void_t.h> #include <__utility/declval.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -24,50 +24,36 @@ _LIBCPP_BEGIN_NAMESPACE_STD -template -struct __has_result_type { -private: - template - static false_type __test(...); - template - static true_type __test(typename _Up::result_type* = 0); +template +inline const bool __has_result_type_v = false; -public: - static const bool value = decltype(__test<_Tp>(0))::value; -}; +template +inline const bool __has_result_type_v<_Tp, __void_t > = true; // __weak_result_type template struct __derives_from_unary_function { private: - struct __two { - char __lx; - char __lxx; - }; - static __two __test(...); + static void __find_base(...); template - static __unary_function<_Ap, _Rp> __test(const volatile __unary_function<_Ap, _Rp>*); + static __unary_function<_Ap, _Rp> __find_base(const volatile __unary_function<_Ap, _Rp>*); public: - static const bool value = !is_same::value; - typedef decltype(__test((_Tp*)0)) type; + using type = decltype(__find_base(static_cast<_Tp*>(nullptr))); + static const bool value = !is_same::value; }; template struct __derives_from_binary_function { private: - struct __two { - char __lx; - char __lxx; - }; - static __two __test(...); + static void __find_base(...); template - static __binary_function<_A1, _A2, _Rp> __test(const volatile __binary_function<_A1, _A2, _Rp>*); + static __binary_function<_A1, _A2, _Rp> __find_base(const volatile __binary_function<_A1, _A2, _Rp>*); public: - static const bool value = !is_same::value; - typedef decltype(__test((_Tp*)0)) type; + using type = decltype(__find_base(static_cast<_Tp*>(nullptr))); + static const bool value = !is_same::value; }; template ::value> @@ -85,7 +71,7 @@ struct __maybe_derive_from_binary_function // bool is true template struct __maybe_derive_from_binary_function<_Tp, false> {}; -template ::value> +template > struct __weak_result_type_imp // bool is true : public __maybe_derive_from_unary_function<_Tp>, public __maybe_derive_from_binary_function<_Tp> {