5 template <
typename ...T>
struct Visitor :
T... {
6 using T::operator()...;
9 using T::operator()...;
10 template<
typename Arg>
requires (!std::is_invocable_v<T, Arg&> && ...)
auto operator()(
Arg&) { };
17 template<
typename ...Args>
struct Variant :
public std::variant<Args...> {
18 using std::variant<
Args...>::variant;
22 template<
typename ...Visitors>
24 return std::visit(
Visitor{ std::forward<Visitors>(
visitors)... }, *
this);
26 template<
typename ...Visitors>
28 return std::visit(
Visitor{ std::forward<Visitors>(
visitors)... }, *
this);
31 template<
typename ...Visitors>
35 template<
typename ...Visitors>
43 return std::get<T>(*
this);
49 return std::get<T>(*
this);
55 return std::get_if<T>(
this);
61 return std::get_if<T>(
this);
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:5
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:149
Extended std::variant with C++23 visit() behavior and convenience Get()/GetIf() methods.
Definition Variant.hpp:17
constexpr T * GetIf()
Definition Variant.hpp:54
auto VisitDefault(Visitors &&... visitors) const
Definition Variant.hpp:36
auto Visit(Visitors &&... visitors)
Definition Variant.hpp:23
constexpr const T & Get() const
Definition Variant.hpp:48
constexpr const T * GetIf() const
Definition Variant.hpp:60
auto Visit(Visitors &&... visitors) const
Definition Variant.hpp:27
auto VisitDefault(Visitors &&... visitors)
Definition Variant.hpp:32
constexpr T & Get()
Definition Variant.hpp:42