21 virtual ~VirtualBase()
noexcept =
default;
22 virtual std::type_info
const &virtual_type()
const noexcept = 0;
23 virtual std::unique_ptr<VirtualBase> virtual_clone()
const noexcept = 0;
26 static std::unique_ptr<VirtualBase> upcast(T
const &value)
noexcept {
27 return std::unique_ptr<VirtualBase>(
new ConcreteType<T>(value));
32 std::unique_ptr<VirtualBase> erased_value;
35 template <
typename T>
struct ConcreteType : VirtualBase {
38 explicit ConcreteType(T
const &val) noexcept : value(val) {}
40 std::type_info
const &virtual_type()
const noexcept override {
44 std::unique_ptr<VirtualBase> virtual_clone()
const noexcept override {
45 return any::VirtualBase::upcast(value);
49 template <
typename T>
friend T any_cast(
ditto::any const &operand);
60 any(T
const &value)
noexcept
61 : erased_value(any::VirtualBase::upcast(value)) {}
63 any(any
const &other)
noexcept;
65 void swap(any &other)
noexcept;
67 any &operator=(any
const &other)
noexcept;
69 std::type_info
const &type()
const noexcept;
71 bool has_value()
const noexcept;
73 template <
typename T> T as()
const {
75 dynamic_cast<any::ConcreteType<T>
const *
>(erased_value.get())) {
78 throw std::bad_cast();