Utilities#
-
template<typename T>
using unwrap_cvref_t = std::remove_cvref_t<std::unwrap_reference_t<T>># A shorthand type alias that removes
std::reference_wrapper, const/volatile and reference qualifiers (in that order) fromT.
-
template<typename IFace, typename T>
concept iface_with_impl# This concept is satisfied if the interface
IFacehas an implementation for the value typeT.
-
template<typename Holder, typename T>
requires any_holder<Holder> && std::derived_from<Holder, T>
[[nodiscard]] const auto &getval(const T *h) noexcept# -
template<typename Holder, typename T>
requires any_holder<Holder> && std::derived_from<Holder, T>
[[nodiscard]] auto &getval(T *h)# -
template<typename Holder, typename T>
requires any_holder<Holder> && std::derived_from<Holder, T>
[[nodiscard]] auto &getval(T &h)# Type-erased value getters.
These getters will return a reference to the type-erased value stored in a
holderof typeHolderderiving fromT. They are meant to be used within the implementation of an interface. Internally, they will employ the curiously recurring template pattern (CRTP) to cast h toHolderand fetch the type-erased value stored within.If the type-erased value stored in h is a
std::reference_wrapper, these getters will unwrap the reference (i.e., they will return a reference to the referenced-to value).
-
template<typename IFace0, typename IFace1, typename ...IFaceN>
struct composite_iface : public IFace0, public IFace1, public IFaceN...# Composite interface.
This class can be used to create a composite interface by multiply inheriting from the interfaces
IFace0,IFace1andIFaceN.
-
template<typename T>
concept valid_value_type = std::is_object_v<T> && (!std::is_const_v<T>) && (!std::is_volatile_v<T>) && std::destructible<T># This concept detects if
Tis a type that can be type-erased by awrap.Tmust be a non-cv qualified destructible object.
-
template<typename IFace, typename Base, typename Holder, typename T>
struct iface_impl# Non-intrusive interface implementation.
This class can be partially specialised to specify a non-intrusive implementation for the interface
IFace. See the tutorial for an example.The unspecialised version of this class is an empty trivial structure which disables non-intrusive implementations for the interface
IFace.