Use std::pointer_traits::to_address when available

This commit is contained in:
Chris Robinson 2023-01-29 21:27:53 -08:00
parent ab142bddf7
commit c79b633a1c

View File

@ -106,6 +106,17 @@ template<typename T, std::size_t N, typename U, std::size_t M>
constexpr bool operator!=(const allocator<T,N>&, const allocator<U,M>&) noexcept { return false; }
namespace detail_ {
template<typename... Ts>
using void_t = void;
template<typename T, typename = void>
constexpr bool has_to_address = false;
template<typename T>
constexpr bool has_to_address<T,
void_t<decltype(std::pointer_traits<T>::to_address(std::declval<const T&>()))>> = true;
} // namespace detail_
template<typename T>
constexpr T *to_address(T *p) noexcept
{
@ -113,7 +124,11 @@ constexpr T *to_address(T *p) noexcept
return p;
}
template<typename T>
template<typename T, std::enable_if_t<detail_::has_to_address<T>,bool> = true>
constexpr auto to_address(const T& p) noexcept
{ return std::pointer_traits<T>::to_address(p); }
template<typename T, std::enable_if_t<!detail_::has_to_address<T>,bool> = true>
constexpr auto to_address(const T& p) noexcept
{ return to_address(p.operator->()); }