#pragma once #include #include template struct Overloaded : Ts... { using Ts::operator()...; }; template Overloaded(Ts...) -> Overloaded; template struct VariantCastProxy { std::variant v; template operator std::variant() const { return std::visit( [](auto&& arg) -> std::variant { return arg; }, v); } }; /// Use snake_case naming to align with `static_cast`, `dynamic_cast`, etc.. template auto variant_cast(std::variant v) -> VariantCastProxy { return { std::move(v) }; }