70 any() : impl_(
nullptr) {}
71 any(
const any& other) : impl_(other.impl_->clone()) {}
72 any(
any&& other) =
default;
73 template <
typename ValueType,
74 typename = detail::disable_if_same_or_derived<any, ValueType> >
75 any(ValueType&& value)
76 : impl_(
new impl<
typename std::decay<ValueType>::type>(
77 std::forward<ValueType>(value))) {}
80 any& operator=(
const any& rhs) {
81 impl_ =
decltype(impl_)(rhs.impl_->clone());
84 any& operator=(
any&& rhs) {
85 impl_ = std::move(rhs.impl_);
88 template <
typename ValueType,
89 typename = detail::disable_if_same_or_derived<any, ValueType> >
90 any& operator=(ValueType&& rhs) {
91 impl_ =
decltype(impl_)(
new impl<
typename std::decay<ValueType>::type>(
92 std::forward<ValueType>(rhs)));
96 template <
class ValueType,
class... Args>
97 typename std::decay<ValueType>::type& emplace(Args&&... args) {
99 impl_ =
new impl<typename std::decay<ValueType>::type>(
100 std::forward<Args>(args)...);
101 return (impl_->cast_static<
typename std::decay<ValueType>::type>()->value);
103 template <
class ValueType,
class U,
class... Args>
104 typename std::decay<ValueType>::type& emplace(std::initializer_list<U> il,
107 impl_ =
new impl<typename std::decay<ValueType>::type>(
108 il, std::forward<Args>(args)...);
109 return (impl_->cast_static<
typename std::decay<ValueType>::type>()->value);
112 void reset() { impl_.reset(); }
114 void swap(
any& other) { std::swap(impl_, other.impl_); }
116 bool has_value()
const {
return static_cast<bool>(impl_); }
118 const std::type_info& type()
const {
120 return impl_->type();
126 template <
typename T>
130 virtual ~impl_base() {}
131 virtual impl_base* clone()
const = 0;
133 virtual const std::type_info& type()
const = 0;
136 template <
typename T>
139 return this->cast_static<T>();
141 return dynamic_cast<impl<T>*
>(
this);
145 template <
typename T>
146 impl<T>* cast_static() {
147 return static_cast<impl<T>*
>(
this);
150 template <
typename T>
151 struct impl :
public impl_base {
152 template <
typename U>
153 explicit impl(U&& v) : value(std::forward<U>(v)) {}
154 impl_base* clone()
const override {
return new impl{value}; }
156 const std::type_info& type()
const override {
return typeid(T); }
161 template <
typename ValueType>
162 friend typename std::decay<ValueType>::type* any_cast(
any* operand);
163 template <
typename ValueType>
164 friend const typename std::decay<ValueType>::type* any_cast(
167 template <
typename ValueType>
168 typename std::decay<ValueType>::type* value_ptr() {
169 return &(impl_->cast_static<
typename std::decay<ValueType>::type>()->value);
172 template <
typename ValueType>
173 const typename std::decay<ValueType>::type* value_ptr()
const {
174 return &(impl_->cast_static<
typename std::decay<ValueType>::type>()->value);
177 std::unique_ptr<impl_base> impl_;