From ea484729c7bb7b430259a422df373e86bdd95b55 Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Thu, 15 Oct 2020 17:43:25 -0300 Subject: [PATCH] Fix var::get to return references --- lokimq/variant.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) 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