16 std::unique_ptr<DynamicObject> _obj;
34 typename std::enable_if<!std::is_same<Variant, typename std::decay<T>::type>::value,
int>::type = 0>
37 Reset(std::forward<T>(obj));
45 if (
other._obj !=
nullptr) {
47 _cloner =
other._cloner;
55 : _obj(std::move(
other._obj)), _cloner(
other._cloner)
57 other._cloner =
nullptr;
85 return _obj !=
nullptr;
94 return _obj ==
nullptr;
102 return _obj ==
other._obj;
120 if (
this == &
other) {
124 if (
other._obj ==
nullptr) {
128 _cloner =
other._cloner;
137 if (
this != &
other) {
138 _obj = std::move(
other._obj);
139 _cloner =
other._cloner;
140 other._cloner =
nullptr;
149 template <
typename T>
151 ->
typename std::enable_if<
152 !std::is_same<Variant, typename std::decay<T>::type>::value &&
153 std::is_base_of<DynamicObject, typename std::decay<T>::type>::value>::type
155 using U =
typename std::decay<T>::type;
156 _obj.reset(
new U(std::forward<T>(obj)));
165 template <
typename T>
167 ->
typename std::enable_if<
168 !std::is_same<Variant, typename std::decay<T>::type>::value &&
169 !std::is_base_of<DynamicObject, typename std::decay<T>::type>::value>::type
171 using U =
typename std::decay<T>::type;
191 template <
typename T>
194 if (_obj ==
nullptr) {
195 if (
pout !=
nullptr) {
200 return _obj->IsType<T>(
pout);
210 template <
typename T>
213 if (_obj ==
nullptr) {
214 if (
pout !=
nullptr) {
219 return _obj->IsType<T>(
pout);
229 template <
typename T>
232 ThrowBadCastIfEmpty();
233 return _obj->DynamicCast<T>();
242 template <
typename T>
245 ThrowBadCastIfEmpty();
246 return _obj->DynamicCast<T>();
256 template <
typename T>
259 ThrowBadCastIfEmpty();
260 return _obj->UnsafeCast<T>();
270 template <
typename T>
273 ThrowBadCastIfEmpty();
274 return _obj->UnsafeCast<T>();
281 void ThrowBadCastIfEmpty()
const
283 if (_obj ==
nullptr) {
284 throw std::bad_cast();
292 template <
typename T>
294 ->
typename std::enable_if<std::is_copy_constructible<T>::value && std::is_base_of<DynamicObject, T>::value>::type
296 _cloner = [](
const DynamicObject &other) -> DynamicObject * {
297 return new T(other.UnsafeCast<T>());
305 template <
typename T>
307 ->
typename std::enable_if<std::is_copy_constructible<T>::value && !std::is_base_of<DynamicObject, T>::value>::type
309 _cloner = [](
const DynamicObject &other) -> DynamicObject * {
310 return new BoxedObject<T>(other.UnsafeCast<BoxedObject<T>>());
318 template <
typename T>
320 ->
typename std::enable_if<!std::is_copy_constructible<T>::value>::type
322 _cloner = [](
const DynamicObject &other) -> DynamicObject * {
323 throw std::runtime_error(
"Object is not copy constructible.");
动态对象基类
Definition Reflection.h:27
相等性比较接口
Definition IComparable.h:14
值转换器接口
Definition IValueConverter.h:14
通用变体类,用于存储任意类型的对象
Definition Variant.h:11
const T & UnsafeCast() const
将Variant对象转换为指定类型的常量引用
Definition Variant.h:271
Variant(T &&obj)
通用构造函数,接受任意类型的对象
Definition Variant.h:35
DynamicObject * Object() const noexcept
获取内部动态对象指针
Definition Variant.h:180
void Reset(Variant &&other) noexcept
重置Variant对象为另一个Variant对象的值
Definition Variant.h:135
bool IsType(T **pout=nullptr)
判断当前Variant存储的对象是否为指定类型
Definition Variant.h:192
bool Equals(const Variant &other) const noexcept
判断两Variant是否为同一对象
Definition Variant.h:100
Variant(Variant &&other) noexcept
移动构造函数
Definition Variant.h:54
auto Reset(T &&obj) -> typename std::enable_if< !std::is_same< Variant, typename std::decay< T >::type >::value &&std::is_base_of< DynamicObject, typename std::decay< T >::type >::value >::type
重置Variant对象为指定类型的对象
Definition Variant.h:150
void Reset()
重置Variant对象为空
Definition Variant.h:108
bool IsNull() const noexcept
判断Variant对象是否为空
Definition Variant.h:92
const T & DynamicCast() const
将Variant对象动态转换为指定类型的常量引用
Definition Variant.h:243
Variant & operator=(Variant &&other) noexcept
移动构造函数
Definition Variant.h:73
Variant & operator=(const Variant &other)
拷贝构造函数
Definition Variant.h:64
T & DynamicCast()
将Variant对象动态转换为指定类型的引用
Definition Variant.h:230
Variant()=default
默认构造函数,创建一个空的Variant对象
bool IsType(const T **pout=nullptr) const
判断当前Variant存储的对象是否为指定类型
Definition Variant.h:211
auto Reset(T &&obj) -> typename std::enable_if< !std::is_same< Variant, typename std::decay< T >::type >::value &&!std::is_base_of< DynamicObject, typename std::decay< T >::type >::value >::type
重置Variant对象为指定类型的对象
Definition Variant.h:166
T & UnsafeCast()
将Variant对象转换为指定类型的引用
Definition Variant.h:257
Variant(const Variant &other)
拷贝构造函数
Definition Variant.h:43
void Reset(const Variant &other)
重置Variant对象为另一个Variant对象的值
Definition Variant.h:118