diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index c2604eac1..cd698ae96 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -1374,7 +1374,8 @@ bool meta_any::set(const id_type id, Type &&value) { // exploits the fact that arithmetic types and enums are also default constructible auto other = type.construct(); ENTT_ASSERT(other.node->conversion_helper, "Conversion helper not found"); - other.node->conversion_helper(other.storage, node->conversion_helper(storage, {})); + const auto value = node->conversion_helper(nullptr, storage.data()); + other.node->conversion_helper(other.storage.data(), &value); return other; } diff --git a/src/entt/meta/node.hpp b/src/entt/meta/node.hpp index 980864b44..c1398e6f1 100644 --- a/src/entt/meta/node.hpp +++ b/src/entt/meta/node.hpp @@ -109,7 +109,7 @@ struct meta_type_node { const size_type size_of; const meta_traits traits; meta_any (*const default_constructor)(); - double (*const conversion_helper)(const any &, const any &); + double (*const conversion_helper)(void *, const void *); const meta_template_node *const templ; meta_ctor_node *ctor{nullptr}; meta_base_node *base{nullptr}; @@ -136,12 +136,12 @@ class ENTT_API meta_node { [[nodiscard]] static auto *meta_conversion_helper() ENTT_NOEXCEPT { if constexpr(std::is_arithmetic_v) { - return +[](const any &storage, const any &value) { - return value ? static_cast(any_cast(const_cast(storage)) = static_cast(any_cast(value))) : static_cast(any_cast(storage)); + return +[](void *bin, const void *value) { + return bin ? static_cast(*static_cast(bin) = static_cast(*static_cast(value))) : static_cast(*static_cast(value)); }; } else if constexpr(std::is_enum_v) { - return +[](const any &storage, const any &value) { - return value ? static_cast(any_cast(const_cast(storage)) = static_cast(static_cast>(any_cast(value)))) : static_cast(any_cast(storage)); + return +[](void *bin, const void *value) { + return bin ? static_cast(*static_cast(bin) = static_cast(static_cast>(*static_cast(value)))) : static_cast(*static_cast(value)); }; } else { return static_cast(nullptr);