Use std::pointer_traits::to_address when available
This commit is contained in:
parent
ab142bddf7
commit
c79b633a1c
@ -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->()); }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user