26class AnyMovable
final {
33 AnyMovable& operator=(AnyMovable&&)
noexcept =
default;
37 template <
typename ValueType,
typename = std::enable_if_t<!std::is_same_v<AnyMovable, std::decay_t<ValueType>>>>
41 template <
typename ValueType,
typename... Args>
42 explicit AnyMovable(std::in_place_type_t<ValueType> tag, Args&&... args);
45 template <
typename ValueType,
typename Item,
typename... Args>
46 explicit AnyMovable(std::in_place_type_t<ValueType> tag, std::initializer_list<Item> list, Args&&... args);
50 template <
typename ValueType>
51 AnyMovable&
operator=(ValueType&& rhs);
60 template <
typename ValueType,
typename... Args>
61 ValueType&
Emplace(Args&&... args) USERVER_IMPL_LIFETIME_BOUND;
64 template <
typename ValueType,
typename Item,
typename... Args>
65 ValueType&
Emplace(std::initializer_list<Item> list, Args&&... args) USERVER_IMPL_LIFETIME_BOUND;
70 template <
typename ValueType>
73 struct HolderDeleter {
77 template <
typename ValueType>
78 friend ValueType*
AnyCast(AnyMovable*)
noexcept;
80 template <
typename ValueType>
81 friend const ValueType*
AnyCast(
const AnyMovable*)
noexcept;
83 std::unique_ptr<
HolderBase, HolderDeleter> content_;
156 : content_(Holder<std::decay_t<ValueType>>::Make(std::forward<ValueType>(value)))
159 !std::is_same_v<AnyMovable*, std::decay_t<ValueType>> &&
160 !std::is_same_v<
const AnyMovable*, std::decay_t<ValueType>>,
161 "AnyMovable misuse detected: trying to wrap AnyMovable* in another "
162 "AnyMovable. The pointer was probably meant to be dereferenced."