// Copyright 2018 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include namespace detail { template struct VariantCastProxy { const std::variant& v; template operator std::variant() const { return std::visit([](auto&& arg) { return std::variant{arg}; }, v); } }; } // namespace detail template auto VariantCast(const std::variant& v) { return detail::VariantCastProxy{v}; } template struct overloaded : Ts... { using Ts::operator()...; }; template overloaded(Ts...) -> overloaded; // Visits a functor with a variant_alternative of the given index. // e.g. WithVariantAlternative>(1, func) calls func() // An out-of-bounds index causes no visitation. template void WithVariantAlternative(std::size_t index, Func&& func) { if constexpr (I < std::variant_size_v) { if (index == 0) func.template operator()>(); else WithVariantAlternative(index - 1, std::forward(func)); } }