11 ValueOrRef(std::reference_wrapper<T> ref) : is_pointer_(
true), variant_(&ref.get()) {}
22 : is_pointer_(other.is_pointer_),
23 variant_(other.is_pointer_ ? Variant(other.variant_.pointer) : Variant(std::move(other.variant_.value))) {}
25 T& value()
noexcept {
return is_pointer_ ? *variant_.pointer : variant_.value; }
27 const T& value()
const noexcept {
return is_pointer_ ? *variant_.pointer : variant_.value; }
30 ValueOrRef(T value) : is_pointer_(
false), variant_(std::move(value)) {}
33 Variant() : pointer(
nullptr) {}
34 Variant(T* ptr) : pointer(ptr) {}
35 Variant(T&& val) : value(std::move(val)) {}
41 const bool is_pointer_;
47 using variant_t = std::variant<Details::ValueOrRef<Xs>...>;
51 EventVariantImpl(std::reference_wrapper<T> event) : variant_{std::in_place_type<Details::ValueOrRef<T>>,
event} {}
54 : variant_(
const_cast<EventVariantImpl&
>(other).visit([](
auto&& arg) -> variant_t {
55 using T = std::remove_reference_t<
decltype(arg.value())>;
56 if constexpr (std::is_const_v<T>) {
57 return variant_t{std::in_place_type<Details::ValueOrRef<T>>, std::cref(arg.value())};
59 return variant_t{std::in_place_type<Details::ValueOrRef<T>>, std::ref(arg.value())};
64 auto visit(F&& visitor) {
65 return std::visit(std::forward<F>(visitor), variant_);
69 auto visit(F&& visitor)
const {
70 return std::visit(std::forward<F>(visitor), variant_);