#pragma once #include namespace NUnifiedAgent { template struct TOverloaded : Ts... { using Ts::operator()...; }; template TOverloaded(Ts...) -> TOverloaded; template auto Visit(T&& variant, U&&... visitorOverloads) { return std::visit(TOverloaded{std::forward(visitorOverloads)...}, std::forward(variant)); } template auto CastTo(std::variant&& variant) { return Visit(variant, [](auto& p) -> TTarget { return std::move(p); }); } }