#pragma once #include #include namespace stdx { inline namespace v1 { template constexpr auto to_address(T *p) noexcept -> T * { static_assert(not stdx::is_function_v, "to_address on a function pointer is ill-formed"); return p; } namespace detail::detect { template constexpr auto pointer_traits_to_address = false; template constexpr auto pointer_traits_to_address< T, std::void_t::to_address( std::declval()))>> = true; } // namespace detail::detect template constexpr auto to_address(T const &t) { if constexpr (detail::detect::pointer_traits_to_address) { return std::pointer_traits::to_address(t); } else { return stdx::to_address(t.operator->()); } } } // namespace v1 } // namespace stdx