24class AnyMovable
final {
31 AnyMovable& operator=(AnyMovable&&)
noexcept =
default;
35 template <
typename ValueType,
typename = std::enable_if_t<!std::is_same_v<AnyMovable, std::decay_t<ValueType>>>>
39 template <
typename ValueType,
typename... Args>
40 explicit AnyMovable(std::in_place_type_t<ValueType> tag, Args&&... args);
43 template <
typename ValueType,
typename Item,
typename... Args>
44 explicit AnyMovable(std::in_place_type_t<ValueType> tag, std::initializer_list<Item> list, Args&&... args);
48 template <
typename ValueType>
49 AnyMovable&
operator=(ValueType&& rhs);
58 template <
typename ValueType,
typename... Args>
59 ValueType&
Emplace(Args&&... args);
62 template <
typename ValueType,
typename Item,
typename... Args>
63 ValueType&
Emplace(std::initializer_list<Item> list, Args&&... args);
68 template <
typename ValueType>
71 struct HolderDeleter {
75 template <
typename ValueType>
76 friend ValueType*
AnyCast(AnyMovable*)
noexcept;
78 template <
typename ValueType>
79 friend const ValueType*
AnyCast(
const AnyMovable*)
noexcept;
81 std::unique_ptr<
HolderBase, HolderDeleter> content_;
151 : content_(Holder<std::decay_t<ValueType>>::Make(std::forward<ValueType>(value))) {
153 !std::is_same_v<AnyMovable*, std::decay_t<ValueType>> &&
154 !std::is_same_v<
const AnyMovable*, std::decay_t<ValueType>>,
155 "AnyMovable misuse detected: trying to wrap AnyMovable* in another "
156 "AnyMovable. The pointer was probably meant to be dereferenced."