diff --git a/libs/util/include/psemek/util/heterogeneous_container.hpp b/libs/util/include/psemek/util/heterogeneous_container.hpp index 8bf93c09..ba98de1b 100644 --- a/libs/util/include/psemek/util/heterogeneous_container.hpp +++ b/libs/util/include/psemek/util/heterogeneous_container.hpp @@ -127,6 +127,10 @@ namespace psemek::util using any = std::variant; + using any_pointer = std::variant; + + using any_const_pointer = std::variant; + static constexpr std::size_t types_count = sizeof...(Types); static_assert(types_count > 0); @@ -153,7 +157,8 @@ namespace psemek::util void clear(); - any get(handle h) const; + any_pointer get(handle h); + any_const_pointer get(handle h) const; template std::enable_if_t, T const &> @@ -240,11 +245,20 @@ namespace psemek::util } template - typename heterogeneous_container::any heterogeneous_container::get(handle h) const + typename heterogeneous_container::any_pointer heterogeneous_container::get(handle h) { auto u = unpack_handle(h); - return detail::tuple_apply_at([&u](auto & t) -> any { - return t[u.second]; + return detail::tuple_apply_at([&u](auto & t) -> any_pointer { + return &t[u.second]; + }, storage_, u.first); + } + + template + typename heterogeneous_container::any_const_pointer heterogeneous_container::get(handle h) const + { + auto u = unpack_handle(h); + return detail::tuple_apply_at([&u](auto & t) -> any_const_pointer { + return &t[u.second]; }, storage_, u.first); }