#ifndef LLARP_VARIANT_HPP #define LLARP_VARIANT_HPP #include namespace llarp { namespace util { template < typename... Ts > struct _overloaded; template < typename T, typename... Ts > struct _overloaded : T, _overloaded { _overloaded(T&& t, Ts&&... ts) : T(t), _overloaded(std::forward(ts)...) {} using T::operator(); using _overloaded< Ts... >::operator(); }; template struct _overloaded : T { _overloaded(T&& t) : T(t) {} using T::operator(); }; template < typename... Ts > constexpr auto overloaded(Ts&&... ts)->_overloaded< Ts... > { return _overloaded(std::forward(ts)...); } } // namespace util } // namespace llarp #endif