template<typename _Tp, typename _Decayed = decay_t<_Tp>>
using _Decay = enable_if_t<!is_same<_Decayed, any>::value, _Decayed>;
+ /// Emplace with an object created from @p __args as the contained object.
+ template <typename _Tp, typename... _Args,
+ typename _Mgr = _Manager<_Tp>>
+ void __do_emplace(_Args&&... __args)
+ {
+ reset();
+ _M_manager = &_Mgr::_S_manage;
+ _Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...);
+ }
+
+ /// Emplace with an object created from @p __il and @p __args as
+ /// the contained object.
+ template <typename _Tp, typename _Up, typename... _Args,
+ typename _Mgr = _Manager<_Tp>>
+ void __do_emplace(initializer_list<_Up> __il, _Args&&... __args)
+ {
+ reset();
+ _M_manager = &_Mgr::_S_manage;
+ _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...);
+ }
+
public:
// construct/destruct
}
}
+ template <typename _Res, typename _Tp, typename... _Args>
+ using __any_constructible =
+ enable_if<__and_<is_copy_constructible<_Tp>,
+ is_constructible<_Tp, _Args...>>::value,
+ _Res>;
+
template <typename _Tp, typename... _Args>
using __any_constructible_t =
- enable_if_t<__and_<is_copy_constructible<_Tp>,
- is_constructible<_Tp, _Args...>>::value,
- bool>;
+ typename __any_constructible<bool, _Tp, _Args...>::type;
/// Construct with a copy of @p __value as the contained object.
template <typename _ValueType, typename _Tp = _Decay<_ValueType>,
typename _Mgr = _Manager<_Tp>,
- __any_constructible_t<_Tp, _ValueType&&> = true>
+ __any_constructible_t<_Tp, _ValueType&&> = true,
+ enable_if_t<!__is_in_place_type<_Tp>::value, bool> = true>
any(_ValueType&& __value)
: _M_manager(&_Mgr::_S_manage)
{
template <typename _ValueType, typename _Tp = _Decay<_ValueType>,
typename _Mgr = _Manager<_Tp>,
enable_if_t<__and_<is_copy_constructible<_Tp>,
- __not_<
- is_constructible<_Tp,
- _ValueType&&>>>::value,
+ __not_<is_constructible<_Tp, _ValueType&&>>,
+ __not_<__is_in_place_type<_Tp>>>::value,
bool> = false>
any(_ValueType&& __value)
: _M_manager(&_Mgr::_S_manage)
}
/// Construct with an object created from @p __args as the contained object.
- template <typename _Tp, typename... _Args,
+ template <typename _ValueType, typename... _Args,
+ typename _Tp = _Decay<_ValueType>,
typename _Mgr = _Manager<_Tp>,
__any_constructible_t<_Tp, _Args&&...> = false>
- any(in_place_type_t<_Tp>, _Args&&... __args)
+ explicit
+ any(in_place_type_t<_ValueType>, _Args&&... __args)
: _M_manager(&_Mgr::_S_manage)
{
_Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...);
/// Construct with an object created from @p __il and @p __args as
/// the contained object.
- template <typename _Tp, typename _Up, typename... _Args,
+ template <typename _ValueType, typename _Up, typename... _Args,
+ typename _Tp = _Decay<_ValueType>,
typename _Mgr = _Manager<_Tp>,
__any_constructible_t<_Tp, initializer_list<_Up>,
_Args&&...> = false>
- any(in_place_type_t<_Tp>, initializer_list<_Up> __il, _Args&&... __args)
+ explicit
+ any(in_place_type_t<_ValueType>,
+ initializer_list<_Up> __il, _Args&&... __args)
: _M_manager(&_Mgr::_S_manage)
{
_Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...);
/// Copy the state of another object.
any& operator=(const any& __rhs)
{
- if (!__rhs.has_value())
- reset();
- else if (this != &__rhs)
- {
- if (has_value())
- _M_manager(_Op_destroy, this, nullptr);
- _Arg __arg;
- __arg._M_any = this;
- __rhs._M_manager(_Op_clone, &__rhs, &__arg);
- }
+ *this = any(__rhs);
return *this;
}
reset();
else if (this != &__rhs)
{
- if (has_value())
- _M_manager(_Op_destroy, this, nullptr);
+ reset();
_Arg __arg;
__arg._M_any = this;
__rhs._M_manager(_Op_xfer, &__rhs, &__arg);
/// Store a copy of @p __rhs as the contained object.
template<typename _ValueType>
- enable_if_t<__and_<__not_<is_same<any, decay_t<_ValueType>>>,
- is_copy_constructible<_ValueType>>::value, any&>
+ enable_if_t<is_copy_constructible<_Decay<_ValueType>>::value, any&>
operator=(_ValueType&& __rhs)
{
*this = any(std::forward<_ValueType>(__rhs));
}
/// Emplace with an object created from @p __args as the contained object.
- template <typename _Tp, typename... _Args,
- typename _Mgr = _Manager<_Tp>,
- __any_constructible_t<_Tp, _Args&&...> = false>
- void emplace(_Args&&... __args)
+ template <typename _ValueType, typename... _Args>
+ typename __any_constructible<void,
+ _Decay<_ValueType>, _Args&&...>::type
+ emplace(_Args&&... __args)
{
- reset();
- _M_manager = &_Mgr::_S_manage;
- _Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...);
+ __do_emplace<_Decay<_ValueType>>
+ (std::forward<_Args>(__args)...);
}
/// Emplace with an object created from @p __il and @p __args as
/// the contained object.
- template <typename _Tp, typename _Up, typename... _Args,
- typename _Mgr = _Manager<_Tp>,
- __any_constructible_t<_Tp, initializer_list<_Up>,
- _Args&&...> = false>
- void emplace(initializer_list<_Up> __il, _Args&&... __args)
+ template <typename _ValueType, typename _Up, typename... _Args>
+ typename __any_constructible<void,
+ _Decay<_ValueType>,
+ initializer_list<_Up>,
+ _Args&&...>::type
+ emplace(initializer_list<_Up> __il, _Args&&... __args)
{
- reset();
- _M_manager = &_Mgr::_S_manage;
- _Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...);
+ __do_emplace<_Decay<_ValueType>, _Up>
+ (__il, std::forward<_Args>(__args)...);
}
// modifiers
template <typename _Tp, typename... _Args>
any make_any(_Args&&... __args)
{
- return any(in_place<_Tp>, std::forward<_Args>(__args)...);
+ return any(in_place_type<_Tp>, std::forward<_Args>(__args)...);
}
/// Create an any holding a @c _Tp constructed from @c __il and @c __args.
template <typename _Tp, typename _Up, typename... _Args>
any make_any(initializer_list<_Up> __il, _Args&&... __args)
{
- return any(in_place<_Tp>, __il, std::forward<_Args>(__args)...);
+ return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...);
}
+ template <typename _Tp>
+ using _AnyCast = remove_cv_t<remove_reference_t<_Tp>>;
/**
* @brief Access the contained object.
*
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<add_const_t<remove_reference_t<_ValueType>>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return *__p;
+ return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
}
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<remove_reference_t<_ValueType>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return *__p;
+ return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
}
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<remove_reference_t<_ValueType>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return *__p;
+ return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
}
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<remove_reference_t<_ValueType>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return std::move(*__p);
+ return static_cast<_ValueType>(std::move(*__p));
__throw_bad_any_cast();
}
// @}
__ptr->~_Tp();
break;
case _Op_xfer:
- ::new(&__arg->_M_any->_M_storage._M_buffer) _Tp(*__ptr);
+ ::new(&__arg->_M_any->_M_storage._M_buffer) _Tp
+ (std::move(*const_cast<_Tp*>(__ptr)));
__ptr->~_Tp();
__arg->_M_any->_M_manager = __any->_M_manager;
const_cast<any*>(__any)->_M_manager = nullptr;