diff --git a/lokimq/variant.h b/lokimq/variant.h index a35ffad..fb4c9fe 100644 --- a/lokimq/variant.h +++ b/lokimq/variant.h @@ -54,15 +54,31 @@ constexpr T&& get(std::variant&& var) { if (auto* v = std::get_if(&var)) return std::move(*v); throw std::runtime_error{"Bad variant access -- variant does not contain the requested type"}; } -template -constexpr auto get(Variant&& var) { - return var::get>>>(std::forward(var)); +template +constexpr auto& get(std::variant& var) { + if (auto* v = std::get_if(&var)) return *v; + throw std::runtime_error{"Bad variant access -- variant does not contain the requested type"}; +} +template +constexpr const auto& get(const std::variant& var) { + if (auto* v = std::get_if(&var)) return *v; + throw std::runtime_error{"Bad variant access -- variant does not contain the requested type"}; +} +template +constexpr const auto&& get(const std::variant&& var) { + if (auto* v = std::get_if(&var)) return std::move(*v); + throw std::runtime_error{"Bad variant access -- variant does not contain the requested type"}; +} +template +constexpr auto&& get(std::variant&& var) { + if (auto* v = std::get_if(&var)) return std::move(*v); + throw std::runtime_error{"Bad variant access -- variant does not contain the requested type"}; } template constexpr auto visit_helper(Visitor&& vis, Variant&& var) { if (var.index() == I) - return std::invoke(std::forward(vis), var::get(std::forward(var))); + return vis(var::get(std::forward(var))); else if constexpr (sizeof...(More) > 0) return visit_helper(std::forward(vis), std::forward(var)); else