diff --git a/src/entt/meta/node.hpp b/src/entt/meta/node.hpp index 3e7a907ef..787242dbd 100644 --- a/src/entt/meta/node.hpp +++ b/src/entt/meta/node.hpp @@ -135,16 +135,12 @@ template meta_type_node resolve() noexcept; template -[[nodiscard]] auto *meta_arg_node(type_list, [[maybe_unused]] const std::size_t index) noexcept { - using element_type = meta_type_node (*)() noexcept; - - if constexpr(sizeof...(Args) == 0u) { - return static_cast(nullptr); - } else { - const element_type args[sizeof...(Args)]{&internal::resolve>>...}; - ENTT_ASSERT(index < sizeof...(Args), "Out of bounds"); - return args[index]; - } +[[nodiscard]] auto meta_arg_node(type_list, [[maybe_unused]] const std::size_t index) noexcept { + std::size_t pos{}; + meta_type_node (*value)() noexcept = nullptr; + ((value = (pos++ == index ? &internal::resolve>> : value)), ...); + ENTT_ASSERT(value != nullptr, "Out of bounds"); + return value(); } [[nodiscard]] inline meta_type_node *try_resolve(const type_info &info) noexcept { @@ -220,7 +216,7 @@ template node.templ = meta_template_node{ meta_template_traits::args_type::size, &resolve::class_type>, - +[](const std::size_t index) noexcept { return meta_arg_node(typename meta_template_traits::args_type{}, index)(); }}; + +[](const std::size_t index) noexcept { return meta_arg_node(typename meta_template_traits::args_type{}, index); }}; } return node; diff --git a/src/entt/meta/utility.hpp b/src/entt/meta/utility.hpp index b0c724f90..1d6fe7542 100644 --- a/src/entt/meta/utility.hpp +++ b/src/entt/meta/utility.hpp @@ -176,7 +176,7 @@ meta_any meta_dispatch([[maybe_unused]] Type &&value) { */ template [[nodiscard]] static meta_type meta_arg(const std::size_t index) noexcept { - return internal::meta_arg_node(Type{}, index)(); + return internal::meta_arg_node(Type{}, index); } /**