8#include "IComparable.h"
20 template <
typename T,
typename =
void>
32 template <
typename,
typename>
45 : _isBoxedObject(
false)
62 return _isBoxedObject;
76 return GetBoxedRawPtr() ==
other.GetBoxedRawPtr();
87#if defined(SW_DISABLE_REFLECTION)
88 throw std::runtime_error(
"Reflection is disabled, cannot get type index.");
91 return GetBoxedType();
104 template <
typename T>
106 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
bool>::type
108#if defined(SW_DISABLE_REFLECTION)
109 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
111 if (
pout ==
nullptr) {
112 return dynamic_cast<T *
>(
this) !=
nullptr;
114 *
pout =
dynamic_cast<T *
>(
this);
115 return *
pout !=
nullptr;
126 template <
typename T>
130#if defined(SW_DISABLE_REFLECTION)
131 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
133 if (
pout ==
nullptr) {
134 return dynamic_cast<const T *
>(
this) !=
nullptr;
136 *
pout =
dynamic_cast<const T *
>(
this);
137 return *
pout !=
nullptr;
148 template <
typename T>
150 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
T &>::type
152#if defined(SW_DISABLE_REFLECTION)
153 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
155 return dynamic_cast<T &
>(*this);
165 template <
typename T>
169#if defined(SW_DISABLE_REFLECTION)
170 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
172 return dynamic_cast<const T &
>(*this);
182 template <
typename T>
184 ->
typename std::enable_if<
187 return static_cast<T &
>(*this);
197 template <
typename T>
199 ->
typename std::enable_if<
211 template <
typename T>
216 return static_cast<const T &
>(*this);
226 template <
typename T>
241 template <
typename T>
251 template <
typename T>
261 template <
typename T>
378 virtual void *GetBoxedRawPtr() noexcept
387 virtual const void *GetBoxedRawPtr() const noexcept
398 template <
typename T>
412 template <
typename U,
typename =
void>
429 template <
typename U>
460 : _isRef(
isRef.val), _data()
462 _isBoxedObject =
true;
468 void Release()
noexcept(std::is_nothrow_destructible<T>::value)
480 template <
typename U = T>
481 auto NotRefCopyConstructImpl(
const BoxedObject &
other)
noexcept(std::is_nothrow_copy_constructible<U>::value)
482 ->
typename std::enable_if<std::is_copy_constructible<U>::value>::type
484 new (_data.objbuf)
T(
other.Unbox());
492 template <
typename U = T>
494 ->
typename std::enable_if<!std::is_copy_constructible<U>::value>::type
496 throw std::logic_error(
"Type T must be copy constructible to copy construct a non-ref BoxedObject.");
504 template <
typename U = T>
505 auto NotRefMoveConstructImpl(
BoxedObject &&
other)
noexcept(std::is_nothrow_move_constructible<U>::value)
506 ->
typename std::enable_if<std::is_move_constructible<U>::value>::type
508 new (_data.objbuf)
T(std::move(
other.Unbox()));
516 template <
typename U = T>
518 ->
typename std::enable_if<!std::is_move_constructible<U>::value>::type
520 throw std::logic_error(
"Type T must be move constructible to move construct a non-ref BoxedObject.");
528 template <
typename U = T>
530 ->
typename std::enable_if<std::is_copy_assignable<U>::value>::type
534 _data.refptr =
other._data.refptr;
537 Unbox() =
other.Unbox();
546 template <
typename U = T>
548 ->
typename std::enable_if<!std::is_copy_assignable<U>::value>::type
552 _data.refptr =
other._data.refptr;
555 throw std::logic_error(
"Type T must be copy assignable to copy assign a non-ref BoxedObject.");
564 template <
typename U = T>
566 ->
typename std::enable_if<std::is_move_assignable<U>::value>::type
570 _data.refptr =
other._data.refptr;
572 other._data.refptr =
nullptr;
574 Unbox() = std::move(
other.Unbox());
583 template <
typename U = T>
585 ->
typename std::enable_if<!std::is_move_assignable<U>::value>::type
589 _data.refptr =
other._data.refptr;
591 other._data.refptr =
nullptr;
593 throw std::logic_error(
"Type T must be move assignable to move assign a non-ref BoxedObject.");
602 template <
typename...
Args>
606 new (_data.objbuf)
T(std::forward<Args>(
args)...);
625 result._data.refptr = ptr;
636 return MakeRef(&
ref);
645 template <
typename U>
647 ->
typename std::enable_if<_IsStaticCastable<U, T>::value,
BoxedObject<T>>::type
663 _data.refptr =
other._data.refptr;
665 NotRefCopyConstructImpl(
other);
678 _data.refptr =
other._data.refptr;
679 other._data.refptr =
nullptr;
681 NotRefMoveConstructImpl(std::move(
other));
699 _data.refptr =
other._data.refptr;
701 auto oldPtr = _data.refptr;
703 NotRefCopyConstructImpl(
other);
711 NotRefCopyAssignImpl(
other);
730 _data.refptr =
other._data.refptr;
731 other._data.refptr =
nullptr;
733 auto oldPtr = _data.refptr;
735 NotRefMoveConstructImpl(std::move(
other));
743 NotRefMoveAssignImpl(std::move(
other));
763 return _isRef && (_data.refptr ==
nullptr);
783 return _isRef ? *_data.refptr : *
reinterpret_cast<T *
>(_data.objbuf);
794 return _isRef ? *_data.refptr : *
reinterpret_cast<const T *
>(_data.objbuf);
802 virtual std::type_index GetBoxedType()
const noexcept override
811 virtual bool IsBoxedPolymorphic() const noexcept
override
813 return std::is_polymorphic<T>::value;
820 virtual void *GetBoxedRawPtr() noexcept
override
823 return const_cast<void *
>(
824 _isRef ?
static_cast<const void *
>(_data.refptr) : static_cast<const void *>(_data.objbuf));
831 virtual const void *GetBoxedRawPtr() const noexcept
override
833 return _isRef ?
static_cast<const void *
>(_data.refptr) : static_cast<const void *>(_data.objbuf);
845 template <
typename T>
847 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
849#if defined(SW_DISABLE_REFLECTION)
850 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
852 if (!_isBoxedObject) {
853 if (pout ==
nullptr) {
854 return dynamic_cast<T *
>(
this) !=
nullptr;
856 *pout =
dynamic_cast<T *
>(
this);
857 return *pout !=
nullptr;
860 if (GetBoxedType() ==
typeid(
T)) {
861 if (pout ==
nullptr) {
862 return GetBoxedRawPtr() !=
nullptr;
864 *pout =
static_cast<T *
>(GetBoxedRawPtr());
865 return *pout !=
nullptr;
868 if (pout !=
nullptr) {
883 template <
typename T>
885 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
887#if defined(SW_DISABLE_REFLECTION)
888 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
890 if (!_isBoxedObject) {
891 if (pout !=
nullptr) {
896 if (GetBoxedType() ==
typeid(
T)) {
897 if (pout ==
nullptr) {
898 return GetBoxedRawPtr() !=
nullptr;
900 *pout =
static_cast<T *
>(GetBoxedRawPtr());
901 return *pout !=
nullptr;
904 if (pout !=
nullptr) {
919 template <
typename T>
921 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
923#if defined(SW_DISABLE_REFLECTION)
924 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
926 if (!_isBoxedObject) {
927 if (pout ==
nullptr) {
928 return dynamic_cast<const T *
>(
this) !=
nullptr;
930 *pout =
dynamic_cast<const T *
>(
this);
931 return *pout !=
nullptr;
934 if (GetBoxedType() ==
typeid(
T)) {
935 if (pout ==
nullptr) {
936 return GetBoxedRawPtr() !=
nullptr;
938 *pout =
static_cast<const T *
>(GetBoxedRawPtr());
939 return *pout !=
nullptr;
942 if (pout !=
nullptr) {
957 template <
typename T>
959 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
961#if defined(SW_DISABLE_REFLECTION)
962 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
964 if (!_isBoxedObject) {
965 if (pout !=
nullptr) {
970 if (GetBoxedType() ==
typeid(
T)) {
971 if (pout ==
nullptr) {
972 return GetBoxedRawPtr() !=
nullptr;
974 *pout =
static_cast<const T *
>(GetBoxedRawPtr());
975 return *pout !=
nullptr;
978 if (pout !=
nullptr) {
993 template <
typename T>
995 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
T &>::type
997#if defined(SW_DISABLE_REFLECTION)
998 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
1000 if (!_isBoxedObject) {
1001 return dynamic_cast<T &
>(*this);
1003 void *rawPtr = GetBoxedRawPtr();
1004 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
1005 throw std::bad_cast();
1007 return *
static_cast<T *
>(rawPtr);
1019 template <
typename T>
1021 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
T &>::type
1023#if defined(SW_DISABLE_REFLECTION)
1024 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
1026 if (!_isBoxedObject) {
1027 throw std::bad_cast();
1029 void *rawPtr = GetBoxedRawPtr();
1030 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
1031 throw std::bad_cast();
1033 return *
static_cast<T *
>(rawPtr);
1045 template <
typename T>
1047 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && _IsDynamicCastable<DynamicObject *,
T *>::value, const
T &>::type
1049#if defined(SW_DISABLE_REFLECTION)
1050 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
1052 if (!_isBoxedObject) {
1053 return dynamic_cast<const T &
>(*this);
1055 const void *rawPtr = GetBoxedRawPtr();
1056 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
1057 throw std::bad_cast();
1059 return *
static_cast<const T *
>(rawPtr);
1071 template <
typename T>
1073 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && !_IsDynamicCastable<DynamicObject *,
T *>::value, const
T &>::type
1075#if defined(SW_DISABLE_REFLECTION)
1076 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
1078 if (!_isBoxedObject) {
1079 throw std::bad_cast();
1081 const void *rawPtr = GetBoxedRawPtr();
1082 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
1083 throw std::bad_cast();
1085 return *
static_cast<const T *
>(rawPtr);
1097 template <
typename T>
1099 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsStaticCastable<DynamicObject *, T *>::value,
T &>::type
1101 if (!_isBoxedObject) {
1102 return static_cast<T &
>(*this);
1104 return static_cast<BoxedObject<T> &
>(*this).Unbox();
1115 template <
typename T>
1117 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsStaticCastable<DynamicObject *, T *>::value,
T &>::type
1119 if (!_isBoxedObject) {
1120 return DynamicCast<T>();
1122 return static_cast<BoxedObject<T> &
>(*this).Unbox();
1132 template <
typename T>
1134 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value &&
_IsStaticCastable<DynamicObject *,
T *>::value, const
T &>::type
1136 if (!_isBoxedObject) {
1137 return static_cast<const T &
>(*this);
1139 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
1150 template <
typename T>
1152 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && !
_IsStaticCastable<DynamicObject *,
T *>::value, const
T &>::type
1154 if (!_isBoxedObject) {
1155 return DynamicCast<T>();
1157 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
1191 return std::to_wstring(
value);
1229 template <
typename T,
typename TField>
1232 auto pfunc = &Reflection::GetFieldId<T, TField>;
1241 for (
size_t i = 0;
i <
sizeof(
buffer); ++
i) {
1257 template <
typename T,
typename TRet,
typename...
Args>
1273 template <
typename T,
typename TRet,
typename...
Args>
1288 template <
typename T,
typename TField>
1292 return obj.UnsafeCast<
T>().*
field;
1304 template <
typename T,
typename TProperty>
1311 return (obj.UnsafeCast<
T>().*
prop).Get();
1323 template <
typename T,
typename TProperty>
1340 template <
typename T,
typename TProperty>
1347 (obj.
UnsafeCast<
T>().*
prop).Set(std::forward<typename TProperty::TSetterParam>(value));
1359 template <
typename T,
typename TProperty>
1379 template <
typename T,
typename TFunc,
typename...
Args>
1381 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
1382 decltype(
method(obj, std::forward<Args>(
args)...))>::type
1385 return method(obj, std::forward<Args>(
args)...);
1398 template <
typename T,
typename TFunc,
typename...
Args>
1400 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
1401 decltype(
method(std::declval<DynamicObject &>(), std::forward<Args>(
args)...))>::type
1416 template <
typename T,
typename TField>
1418 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
TField &>::type
1432 template <
typename T,
typename TField>
1434 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
TField &>::type
1449 template <
typename T,
typename TValue>
1451 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value, TValue>::type
1465 template <
typename T,
typename TValue>
1467 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value, TValue>::type
1483 template <
typename T,
typename TParam,
typename TValue>
1485 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value>::type
1488 setter(obj, std::forward<TValue>(value));
1500 template <
typename T,
typename TParam,
typename TValue>
1502 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value>::type
1513struct std::hash<
sw::FieldId>
1515 size_t operator()(
sw::FieldId fieldId)
const noexcept
1517 return static_cast<size_t>(fieldId.
value);
BoxedObject(const BoxedObject &other) noexcept(std::is_nothrow_copy_constructible< T >::value)
拷贝构造函数
Definition Reflection.h:659
static auto MakeRef(BoxedObject< U > &other) noexcept -> typename std::enable_if< _IsStaticCastable< U, T >::value, BoxedObject< T > >::type
创建引用类型的装箱对象
Definition Reflection.h:646
BoxedObject(BoxedObject &&other) noexcept(std::is_nothrow_move_constructible< T >::value)
移动构造函数
Definition Reflection.h:674
T & Unbox() noexcept
获取装箱对象中的值
Definition Reflection.h:780
static BoxedObject< T > MakeRef(T *ptr) noexcept
创建引用类型的装箱对象
Definition Reflection.h:622
BoxedObject(Args &&...args)
构造值类型的装箱对象
Definition Reflection.h:603
bool HasValue() const noexcept
判断当前装箱对象是否包含有效值
Definition Reflection.h:770
bool IsRef() const noexcept
判断当前装箱对象是否为引用类型
Definition Reflection.h:752
BoxedObject & operator=(BoxedObject &&other)
移动赋值运算符
Definition Reflection.h:723
static BoxedObject< T > MakeRef(T &ref) noexcept
创建引用类型的装箱对象
Definition Reflection.h:634
bool IsNullRef() const noexcept
判断当前装箱对象是否为空引用
Definition Reflection.h:761
virtual ~BoxedObject()
析构函数
Definition Reflection.h:612
const T & Unbox() const noexcept
获取装箱对象中的值
Definition Reflection.h:791
BoxedObject & operator=(const BoxedObject &other)
拷贝赋值运算符
Definition Reflection.h:692
装箱对象模板类声明
Definition Reflection.h:21
动态对象基类
Definition Reflection.h:27
auto UnsafeCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsStaticCastable< DynamicObject *, T * >::value, T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:183
auto IsType(const T **pout=nullptr) const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, bool >::type
判断对象是否为指定类型
Definition Reflection.h:127
std::type_index GetType() const noexcept
获取对象的类型信息
Definition Reflection.h:85
auto UnsafeCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsStaticCastable< DynamicObject *, T * >::value, T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:198
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:212
bool ReferenceEquals(const DynamicObject &other) const noexcept
判断与另一DynamicObject是否引用同一对象
Definition Reflection.h:70
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:227
virtual ~DynamicObject()
析构函数
Definition Reflection.h:52
auto DynamicCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, T & >::type
将对象动态转换为指定类型的引用
Definition Reflection.h:149
auto IsType(const T **pout=nullptr) const -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value &&_IsDynamicCastable< DynamicObject *, T * >::value, bool >::type
判断对象是否为指定类型
auto DynamicCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, const T & >::type
将对象动态转换为指定类型的常量引用
Definition Reflection.h:166
auto IsType(T **pout=nullptr) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value &&_IsDynamicCastable< DynamicObject *, T * >::value, bool >::type
判断对象是否为指定类型
auto IsType(T **pout=nullptr) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, bool >::type
判断对象是否为指定类型
Definition Reflection.h:105
DynamicObject() noexcept
默认构造函数
Definition Reflection.h:44
bool IsBoxedObject() const noexcept
判断对象是否为装箱对象
Definition Reflection.h:60
auto IsType(T **pout=nullptr) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value &&!_IsDynamicCastable< DynamicObject *, T * >::value, bool >::type
判断对象是否为指定类型
全序比较接口
Definition IComparable.h:54
为支持ToString方法的类提供统一接口
Definition IToString.h:13
值转换器接口
Definition IValueConverter.h:14
提供反射相关功能
Definition Reflection.h:1214
static auto GetMethod(TRet(T::*method)(Args...)) -> Delegate< TRet(DynamicObject &, Args...)>
获取成员函数的委托
Definition Reflection.h:1258
static auto AccessField(const Delegate< TField &(DynamicObject &)> &accessor, T &obj) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value, TField & >::type
访问字段
Definition Reflection.h:1433
static auto InvokeMethod(const Delegate< TFunc > &method, T &obj, Args &&...args) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value, decltype(method(std::declval< DynamicObject & >(), std::forward< Args >(args)...))>::type
调用成员函数
Definition Reflection.h:1399
static auto GetFieldAccessor(TField T::*field) -> Delegate< TField &(DynamicObject &)>
获取字段的访问器
Definition Reflection.h:1289
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< _IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:1341
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsProperty< TProperty >::value &&!_IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1324
static auto GetProperty(const Delegate< TValue(DynamicObject &)> &getter, T &obj) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value, TValue >::type
获取属性值
Definition Reflection.h:1466
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:1230
static auto GetProperty(const Delegate< TValue(DynamicObject &)> &getter, T &obj) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, TValue >::type
获取属性值
Definition Reflection.h:1450
static auto AccessField(const Delegate< TField &(DynamicObject &)> &accessor, T &obj) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, TField & >::type
访问字段
Definition Reflection.h:1417
static auto SetProperty(const Delegate< void(DynamicObject &, TParam)> &setter, T &obj, TValue &&value) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value >::type
设置属性值
Definition Reflection.h:1501
static auto GetMethod(TRet(T::*method)(Args...) const) -> Delegate< TRet(DynamicObject &, Args...)>
获取常量成员函数的委托
Definition Reflection.h:1274
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1305
static auto SetProperty(const Delegate< void(DynamicObject &, TParam)> &setter, T &obj, TValue &&value) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value >::type
设置属性值
Definition Reflection.h:1484
static auto InvokeMethod(const Delegate< TFunc > &method, T &obj, Args &&...args) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, decltype(method(obj, std::forward< Args >(args)...))>::type
调用成员函数
Definition Reflection.h:1380
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< _IsProperty< TProperty >::value &&!_IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:1360
Reflection()=delete
静态类,不允许实例化
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
_IsExplicitlyConvertable< TFrom, TTo > _IsStaticCastable
用于判断是否可以通过static_cast进行转换
Definition Internal.h:34
表示字段的唯一标识符
Definition Reflection.h:1167
std::wstring ToString() const
获取字段ID的字符串表示形式
Definition Reflection.h:1189
int CompareTo(FieldId other) const
比较字段ID
Definition Reflection.h:1198
uint32_t value
字段ID的数值
Definition Reflection.h:1171
FieldId(uint32_t value)
构造指定值的字段ID
Definition Reflection.h:1181
判断类型是否可以使用dynamic_cast进行转换的辅助模板
Definition Internal.h:40
判断类型是否为属性的辅助模板
Definition Property.h:95
判断类型是否为可读属性的辅助模板
Definition Property.h:133
判断类型是否为可写属性的辅助模板
Definition Property.h:141