diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index eb58ca320..82fe463f6 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -185,17 +185,21 @@ class meta_any { } } - if constexpr(is_complete_v>) { - if(!!(req & internal::meta_traits::is_sequence_container)) { - // NOLINTNEXTLINE(bugprone-casting-through-void) - *static_cast(const_cast(other)) = !!(req & internal::meta_traits::is_const) ? meta_sequence_container{*value.ctx, any_cast(value.storage)} : meta_sequence_container{*value.ctx, any_cast(const_cast(value).storage)}; - } - } + if constexpr(is_complete_v> || is_complete_v>) { + using container_type = std::conditional_t>, meta_sequence_container, meta_associative_container>; + static constexpr auto flag = is_complete_v> ? internal::meta_traits::is_sequence_container : internal::meta_traits::is_associative_container; + + if(!!(req & flag)) { + if(!(req & internal::meta_traits::is_const)) { + if(auto *elem = any_cast(&const_cast(value).storage); elem != nullptr) { + // NOLINTNEXTLINE(bugprone-casting-through-void) + *static_cast(const_cast(other)) = container_type{*value.ctx, *elem}; + return; + } + } - if constexpr(is_complete_v>) { - if(!!(req & internal::meta_traits::is_associative_container)) { // NOLINTNEXTLINE(bugprone-casting-through-void) - *static_cast(const_cast(other)) = !!(req & internal::meta_traits::is_const) ? meta_associative_container{*value.ctx, any_cast(value.storage)} : meta_associative_container{*value.ctx, any_cast(const_cast(value).storage)}; + *static_cast(const_cast(other)) = container_type{*value.ctx, any_cast(value.storage)}; } } } @@ -524,7 +528,7 @@ public: * @return A sequence container proxy for the underlying object. */ [[nodiscard]] meta_sequence_container as_sequence_container() noexcept { - meta_sequence_container proxy = (storage.policy() == any_policy::cref) ? std::as_const(*this).as_sequence_container() : meta_sequence_container{}; + meta_sequence_container proxy{}; if(!proxy && vtable != nullptr) { vtable(internal::meta_traits::is_sequence_container, *this, &proxy); } return proxy; } @@ -541,7 +545,7 @@ public: * @return An associative container proxy for the underlying object. */ [[nodiscard]] meta_associative_container as_associative_container() noexcept { - meta_associative_container proxy = (storage.policy() == any_policy::cref) ? std::as_const(*this).as_associative_container() : meta_associative_container{}; + meta_associative_container proxy{}; if(!proxy && vtable != nullptr) { vtable(internal::meta_traits::is_associative_container, *this, &proxy); } return proxy; }