diff -r 232e7634cc8a -r b27b90fb993f src/model.h --- a/src/model.h Thu Jun 09 13:32:55 2022 +0300 +++ b/src/model.h Thu Jun 09 19:11:27 2022 +0300 @@ -60,6 +60,12 @@ }; template +struct transfer_reference +{ + using type = const std::remove_reference_t&; +}; + +template struct transfer_reference { using type = std::remove_reference_t&&; @@ -88,7 +94,7 @@ ConditionalEdge>>; template -struct remove_color { using type = T; }; +struct remove_color {}; template struct remove_color> { using type = T; }; @@ -97,30 +103,43 @@ struct remove_color&> { using type = T&; }; template +struct remove_color&> { using type = const T&; }; + +template struct remove_color&&> { using type = T&&; }; template using remove_color_t = typename remove_color::type; +static_assert(std::is_same_v>, Triangle>); +static_assert(std::is_same_v&>, Triangle&>); +static_assert(std::is_same_v&>, const Triangle&>); + template constexpr remove_color_t extract_colored(T&& x) { return static_cast>(x); } -template -constexpr auto visitPolygon( - std::function)> f1, - std::function)> f2, - std::function)> f3, - std::function)> f4, - T&& element) +template +constexpr auto visitPolygon(Fn1&& f1, Fn2&& f2, Fn3&& f3, Fn4&& f4, T&& element) { - return std::visit(overloaded{f1, f2, f3, f4}, extract_colored(element)); + if (std::holds_alternative(element)) { + return f1(std::get(element)); + } + else if (std::holds_alternative(element)) { + return f2(std::get(element)); + } + else if (std::holds_alternative(element)) { + return f3(std::get(element)); + } + else { + return f4(std::get(element)); + } } template -constexpr void visitPoints(T&& element, Fn func) +constexpr void visitPoints(Fn&& func, T&& element) { visitPolygon( [&func](transfer_reference_t edge)