[libc++][NFC] Simplify SFINAE detections in weak_result_type.h (#169870)

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 is 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`.
This commit is contained in:
A. Jiang 2025-11-28 18:55:13 +08:00 committed by GitHub
parent 1ab64e4d5f
commit 7415a7fc11
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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 <class _Tp>
struct __has_result_type {
private:
template <class _Up>
static false_type __test(...);
template <class _Up>
static true_type __test(typename _Up::result_type* = 0);
template <class _Tp, class = void>
inline const bool __has_result_type_v = false;
public:
static const bool value = decltype(__test<_Tp>(0))::value;
};
template <class _Tp>
inline const bool __has_result_type_v<_Tp, __void_t<typename _Tp::result_type*> > = true;
// __weak_result_type
template <class _Tp>
struct __derives_from_unary_function {
private:
struct __two {
char __lx;
char __lxx;
};
static __two __test(...);
static void __find_base(...);
template <class _Ap, class _Rp>
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<decltype(__test((_Tp*)0)), __two>::value;
typedef decltype(__test((_Tp*)0)) type;
using type = decltype(__find_base(static_cast<_Tp*>(nullptr)));
static const bool value = !is_same<type, void>::value;
};
template <class _Tp>
struct __derives_from_binary_function {
private:
struct __two {
char __lx;
char __lxx;
};
static __two __test(...);
static void __find_base(...);
template <class _A1, class _A2, class _Rp>
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<decltype(__test((_Tp*)0)), __two>::value;
typedef decltype(__test((_Tp*)0)) type;
using type = decltype(__find_base(static_cast<_Tp*>(nullptr)));
static const bool value = !is_same<type, void>::value;
};
template <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
@ -85,7 +71,7 @@ struct __maybe_derive_from_binary_function // bool is true
template <class _Tp>
struct __maybe_derive_from_binary_function<_Tp, false> {};
template <class _Tp, bool = __has_result_type<_Tp>::value>
template <class _Tp, bool = __has_result_type_v<_Tp> >
struct __weak_result_type_imp // bool is true
: public __maybe_derive_from_unary_function<_Tp>,
public __maybe_derive_from_binary_function<_Tp> {