feat: std::is_object constraint applied to value_type_t

This commit is contained in:
Mateusz Pusz
2024-10-26 19:12:10 +02:00
parent 2a1edbe47a
commit 424f9665db

View File

@@ -106,19 +106,24 @@ template<typename T>
requires { typename std::indirectly_readable_traits<T>::value_type; } requires { typename std::indirectly_readable_traits<T>::value_type; }
using wrapped_type_t = std::indirectly_readable_traits<T>::value_type; using wrapped_type_t = std::indirectly_readable_traits<T>::value_type;
namespace detail {
template<typename T> template<typename T>
struct value_type { struct value_type_impl {
using type = T; using type = T;
}; };
template<typename T> template<typename T>
requires requires { typename wrapped_type_t<T>; } requires requires { typename wrapped_type_t<T>; }
struct value_type<T> { struct value_type_impl<T> {
using type = wrapped_type_t<T>; using type = wrapped_type_t<T>;
}; };
} // namespace detail
template<typename T> template<typename T>
using value_type_t = value_type<T>::type; requires std::is_object_v<T>
using value_type_t = detail::value_type_impl<T>::type;
template<typename T, typename... Ts> template<typename T, typename... Ts>
concept one_of = (false || ... || std::same_as<T, Ts>); concept one_of = (false || ... || std::same_as<T, Ts>);