41 std::unique_ptr<DynamicObject> _obj;
70 if (
ref.ptr !=
nullptr) {
83 typename std::enable_if<!std::is_same<Variant, typename std::decay<T>::type>::value,
int>::type = 0>
86 Reset(std::forward<T>(obj));
95 if (
other._obj !=
nullptr) {
97 _cloner =
other._cloner;
105 : _obj(std::move(
other._obj)), _cloner(
other._cloner)
107 other._cloner =
nullptr;
135 return _obj !=
nullptr;
144 return _obj ==
nullptr;
153 return _obj !=
nullptr;
168 if (
a ==
nullptr && b ==
nullptr) {
171 if (
a ==
nullptr || b ==
nullptr) {
174 return a->ReferenceEquals(*b);
203 if (
ref.ptr ==
nullptr) {
217 if (
this == &
other) {
221 if (
other._obj ==
nullptr) {
225 _cloner =
other._cloner;
234 if (
this != &
other) {
235 _obj = std::move(
other._obj);
236 _cloner =
other._cloner;
237 other._cloner =
nullptr;
246 template <
typename T>
248 ->
typename std::enable_if<
249 !std::is_same<Variant, typename std::decay<T>::type>::value &&
250 std::is_base_of<DynamicObject, typename std::decay<T>::type>::value>::type
252 using U =
typename std::decay<T>::type;
253 _obj.reset(
new U(std::forward<T>(obj)));
262 template <
typename T>
264 ->
typename std::enable_if<
265 !std::is_same<Variant, typename std::decay<T>::type>::value &&
266 !std::is_base_of<DynamicObject, typename std::decay<T>::type>::value>::type
268 using U =
typename std::decay<T>::type;
281 if (_obj ==
nullptr) {
301 if (_obj ==
nullptr) {
322 return p ==
nullptr ?
typeid(
void) :
p->GetType();
332 template <
typename T>
338 if (
pout !=
nullptr) {
343 return p->IsType<
T>(
pout);
353 template <
typename T>
359 if (
pout !=
nullptr) {
364 return p->IsType<
T>(
pout);
374 template <
typename T>
380 throw std::bad_cast();
382 return p->DynamicCast<
T>();
392 template <
typename T>
398 throw std::bad_cast();
400 return p->DynamicCast<
T>();
411 template <
typename T>
417 throw std::bad_cast();
419 return p->UnsafeCast<
T>();
430 template <
typename T>
436 throw std::bad_cast();
438 return p->UnsafeCast<
T>();
446 template <
typename T>
448 ->
typename std::enable_if<std::is_copy_constructible<T>::value && std::is_base_of<DynamicObject, T>::value>::type
451 return new T(
other.UnsafeCast<
T>());
459 template <
typename T>
461 ->
typename std::enable_if<std::is_copy_constructible<T>::value && !std::is_base_of<DynamicObject, T>::value>::type
463 _cloner = [](
const DynamicObject &other) -> DynamicObject * {
464 return new BoxedObject<T>(other.UnsafeCast<BoxedObject<T>>());
474 template <
typename T>
476 ->
typename std::enable_if<!std::is_copy_constructible<T>::value>::type
478 _cloner = [](
const DynamicObject &other) -> DynamicObject * {
479 throw std::runtime_error(
"Object is not copy constructible.");
493 template <
typename T,
typename... Args>
495 ->
typename std::enable_if<
496 !std::is_same<T, Variant>::value &&
497 std::is_base_of<DynamicObject, T>::value,
501 v._obj.reset(
new T(std::forward<Args>(
args)...));
515 template <
typename T,
typename...
Args>
517 ->
typename std::enable_if<
518 !std::is_same<T, Variant>::value &&
519 !std::is_base_of<DynamicObject, T>::value,
550 template <
typename T>
552 ->
typename std::enable_if<
553 !std::is_same<T, Variant>::value &&
554 std::is_base_of<DynamicObject, T>::value,
571 template <
typename T>
573 ->
typename std::enable_if<
574 !std::is_same<T, Variant>::value &&
575 !std::is_base_of<DynamicObject, T>::value,
装箱对象模板类声明
Definition Reflection.h:21
动态对象基类
Definition Reflection.h:27
值转换器接口
Definition IValueConverter.h:14
通用变体类型容器,类型擦除地持有任意类型对象
Definition Variant.h:36
static auto MakeVal(Args &&...args) -> typename std::enable_if< !std::is_same< T, Variant >::value &&!std::is_base_of< DynamicObject, T >::value, Variant >::type
就地构造一个值语义的Variant(非DynamicObject类型重载)
Definition Variant.h:516
const T & UnsafeCast() const
将Variant对象转换为指定类型的常量引用
Definition Variant.h:431
static Variant MakeRef(Variant &v)
创建一个对另一Variant内部对象的引用Variant(Variant转发重载)
Definition Variant.h:536
std::type_index GetType() const
获取内部对象的类型信息
Definition Variant.h:319
bool ReferenceEquals(const Variant &other) const noexcept
判断两Variant是否引用同一对象(指针身份比较)
Definition Variant.h:163
Variant(T &&obj)
通用构造函数,接受任意类型的对象(值语义)
Definition Variant.h:84
bool HasValue() const noexcept
判断Variant对象是否包含值
Definition Variant.h:151
void Reset(Variant &&other) noexcept
重置Variant对象为另一个Variant对象的值
Definition Variant.h:232
void Reset() noexcept
重置Variant对象为空
Definition Variant.h:180
static auto MakeVal(Args &&...args) -> typename std::enable_if< !std::is_same< T, Variant >::value &&std::is_base_of< DynamicObject, T >::value, Variant >::type
就地构造一个值语义的Variant(DynamicObject派生类型重载)
Definition Variant.h:494
bool IsType(T **pout=nullptr)
判断当前Variant存储的对象是否为指定类型
Definition Variant.h:333
const DynamicObject * Object() const noexcept
获取内部动态对象的常量指针
Definition Variant.h:299
Variant(Variant &&other) noexcept
移动构造函数
Definition Variant.h:104
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:247
static auto MakeRef(T &obj) -> typename std::enable_if< !std::is_same< T, Variant >::value &&!std::is_base_of< DynamicObject, T >::value, Variant >::type
创建一个对外部对象的引用Variant(非DynamicObject类型重载)
Definition Variant.h:572
static auto MakeRef(T &obj) -> typename std::enable_if< !std::is_same< T, Variant >::value &&std::is_base_of< DynamicObject, T >::value, Variant >::type
创建一个对外部对象的引用Variant(DynamicObject派生类型重载)
Definition Variant.h:551
bool IsNull() const noexcept
判断Variant对象是否为空
Definition Variant.h:142
DynamicObject * Object() noexcept
获取内部动态对象指针
Definition Variant.h:279
Variant(std::nullptr_t) noexcept
从nullptr构造一个空的Variant对象
Definition Variant.h:57
Variant(ObjectRef ref)
以引用语义构造Variant
Definition Variant.h:68
const T & DynamicCast() const
将Variant对象动态转换为指定类型的常量引用
Definition Variant.h:393
Variant & operator=(Variant &&other) noexcept
移动赋值运算符
Definition Variant.h:123
Variant & operator=(const Variant &other)
拷贝赋值运算符
Definition Variant.h:114
T & DynamicCast()
将Variant对象动态转换为指定类型的引用
Definition Variant.h:375
Variant()=default
默认构造函数,创建一个空的Variant对象
bool IsType(const T **pout=nullptr) const
判断当前Variant存储的对象是否为指定类型
Definition Variant.h:354
void Reset(std::nullptr_t) noexcept
重置Variant对象为空
Definition Variant.h:189
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:263
T & UnsafeCast()
将Variant对象转换为指定类型的引用
Definition Variant.h:412
void Reset(ObjectRef ref)
重置Variant对象为指定的引用标记
Definition Variant.h:201
Variant(const Variant &other)
拷贝构造函数
Definition Variant.h:93
void Reset(const Variant &other)
重置Variant对象为另一个Variant对象的值
Definition Variant.h:215
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
动态对象引用标记类型
Definition Variant.h:13
DynamicObject * ptr
被引用的DynamicObject指针
Definition Variant.h:17