Alias template weak_proxy
Class template weak_facade
Header:
proxy.h
Module:proxy
Namespace:pro::inline v4
Since: 3.3.0
template <facade F> struct weak_facade; template <facade F> using weak_proxy = proxy<weak_facade<F>>;
weak_proxy<F>
is a non-owning handle that participates in the weak ownership model of an object that (when alive) models proxiable_target<T, F>
. It is analogous to std::weak_ptr
relative to std::shared_ptr
: it never extends the lifetime of the underlying object, but it can attempt to produce a (strong) proxy<F>
via lock()
.
weak_facade<F>
adapts the original facade F
so that:
- A
lock()
member (direct convention) is provided, returning aproxy<F>
that contains a value if and only if the referenced object is still alive at the time of the call. - All direct substitution conversions that would have produced a
proxy<G>
become conversions that produce aweak_proxy<G>
instead (so that "weak-ness" is preserved across facade-substitution). - No reflections from
F
are preserved.
Member Types of weak_facade
Name | Description |
---|---|
convention_types | A tuple-like type transformed from typename F::convention_types . Specifically: - It always prepends a direct convention whose dispatch type denotes the member function lock and whose single overload has signature proxy<F>() const noexcept . Calling this overload attempts to obtain a strong proxy<F> ; it returns an empty proxy<F> if the object has expired.- For any direct convention C in F whose dispatch_type is substitution_dispatch , a transformed convention C' is included, whose* is_direct is true and dispatch_type is still substitution_dispatch .* For every overload O in typename C::overload_types with signature (after cv/ref/noexcept qualifiers) returning a proxy<G> , replace its return type with weak_proxy<G> while preserving qualifiers and noexcept .- All other conventions from F are discarded. |
reflection_types | A tuple-like type that contains no types. |
Member Constants of weak_facade
Name | Definition |
---|---|
max_size [static] [constexpr] | F::max_size |
max_align [static] [constexpr] | F::max_align |
copyability [static] [constexpr] | F::copyability |
relocatability [static] [constexpr] | F::relocatability |
destructibility [static] [constexpr] | F::destructibility |
Example
#include <iostream> #include <proxy/proxy.h> struct Formattable : pro::facade_builder // ::add_skill<pro::skills::format> // ::build {}; int main() { std::shared_ptr<int> val = std::make_shared<int>(123); pro::weak_proxy<Formattable> wp = std::weak_ptr{val}; pro::proxy<Formattable> p = wp.lock(); std::cout << std::boolalpha << p.has_value() << "\n"; // Prints "true" std::cout << std::format("{}\n", *p); // Prints "123" p.reset(); val.reset(); p = wp.lock(); std::cout << p.has_value() << "\n"; // Prints "false" }