8#include "IComparable.h"
19 template <
typename TFrom,
typename TTo>
20 using _IsStaticCastable = _IsExplicitlyConvertable<TFrom, TTo>;
39#if defined(_SW_DISABLE_REFLECTION)
40 throw std::runtime_error(
"Reflection is disabled, cannot get type index.");
55#if defined(_SW_DISABLE_REFLECTION)
56 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
58 if (pout ==
nullptr) {
59 return dynamic_cast<T *
>(
this) !=
nullptr;
61 *pout =
dynamic_cast<T *
>(
this);
62 return *pout !=
nullptr;
74 bool IsType(
const T **pout =
nullptr)
const
76#if defined(_SW_DISABLE_REFLECTION)
77 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
79 if (pout ==
nullptr) {
80 return dynamic_cast<const T *
>(
this) !=
nullptr;
82 *pout =
dynamic_cast<const T *
>(
this);
83 return *pout !=
nullptr;
97#if defined(_SW_DISABLE_REFLECTION)
98 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
100 return dynamic_cast<T &
>(*this);
110 template <
typename T>
113#if defined(_SW_DISABLE_REFLECTION)
114 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
116 return dynamic_cast<const T &
>(*this);
126 template <
typename T>
128 ->
typename std::enable_if<_IsStaticCastable<DynamicObject *, T *>::value, T &>::type
130 return static_cast<T &
>(*this);
139 template <
typename T>
141 ->
typename std::enable_if<!_IsStaticCastable<DynamicObject *, T *>::value, T &>::type
143 return DynamicCast<T>();
152 template <
typename T>
156 return static_cast<const T &
>(*this);
165 template <
typename T>
169 return DynamicCast<T>();
201 return std::to_wstring(
value);
236 template <
typename T,
typename TField>
239 auto pfunc = &Reflection::GetFieldId<T, TField>;
241 uint8_t buffer[
sizeof(pfunc) +
sizeof(field)];
242 memcpy(buffer, &pfunc,
sizeof(pfunc));
243 memcpy(buffer +
sizeof(pfunc), &field,
sizeof(field));
245 uint32_t prime = 16777619u;
246 uint32_t hash = 2166136261u;
248 for (
size_t i = 0; i <
sizeof(buffer); ++i) {
249 hash ^=
static_cast<uint32_t
>(buffer[i]);
264 template <
typename T,
typename TRet,
typename... Args>
266 -> typename std::enable_if<
270 return (obj.
UnsafeCast<T>().*method)(std::forward<Args>(args)...);
282 template <
typename T,
typename TRet,
typename... Args>
284 -> typename std::enable_if<
288 return (obj.
UnsafeCast<T>().*method)(std::forward<Args>(args)...);
299 template <
typename T,
typename TField>
301 -> typename std::enable_if<
305 return obj.UnsafeCast<T>().*field;
317 template <
typename T,
typename TProperty>
319 -> typename std::enable_if<
323 return [prop](
DynamicObject &obj) ->
typename TProperty::TValue {
324 return (obj.UnsafeCast<T>().*prop).Get();
336 template <
typename T,
typename TProperty>
338 -> typename std::enable_if<
353 template <
typename T,
typename TProperty>
355 -> typename std::enable_if<
359 return [prop](
DynamicObject &obj,
typename TProperty::TSetterParam value) {
360 (obj.
UnsafeCast<T>().*prop).Set(std::forward<typename TProperty::TSetterParam>(value));
372 template <
typename T,
typename TProperty>
374 -> typename std::enable_if<
385struct std::hash<sw::FieldId>
387 size_t operator()(
sw::FieldId fieldId)
const noexcept
389 return static_cast<size_t>(fieldId.
value);
动态对象基类
Definition Reflection.h:26
auto UnsafeCast() -> typename std::enable_if<!_IsStaticCastable< DynamicObject *, T * >::value, T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:140
virtual ~DynamicObject()=default
析构函数
auto UnsafeCast() const -> typename std::enable_if< _IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:153
T & DynamicCast()
将对象动态转换为指定类型的引用
Definition Reflection.h:95
bool IsType(const T **pout=nullptr) const
判断对象是否为指定类型
Definition Reflection.h:74
auto UnsafeCast() -> typename std::enable_if< _IsStaticCastable< DynamicObject *, T * >::value, T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:127
auto UnsafeCast() const -> typename std::enable_if<!_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:166
const T & DynamicCast() const
将对象动态转换为指定类型的常量引用
Definition Reflection.h:111
bool IsType(T **pout=nullptr)
判断对象是否为指定类型
Definition Reflection.h:53
std::type_index GetTypeIndex() const
获取对象的类型索引
Definition Reflection.h:37
全序比较接口
Definition IComparable.h:54
为支持ToString方法的类提供统一接口
Definition IToString.h:13
提供反射相关功能
Definition Reflection.h:222
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:337
static auto GetMethod(TRet(T::*method)(Args...) const) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, Delegate< TRet(DynamicObject &, Args...)> >::type
获取常量成员函数的委托
Definition Reflection.h:283
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:373
static auto GetMethod(TRet(T::*method)(Args...)) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, Delegate< TRet(DynamicObject &, Args...)> >::type
获取成员函数的委托
Definition Reflection.h:265
static auto GetFieldAccessor(TField T::*field) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, Delegate< TField &(DynamicObject &)> >::type
获取字段的访问器
Definition Reflection.h:300
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:237
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:354
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:318
Reflection()=delete
静态类,不允许实例化
表示字段的唯一标识符
Definition Reflection.h:177
std::wstring ToString() const
获取字段ID的字符串表示形式
Definition Reflection.h:199
int CompareTo(FieldId other) const
比较字段ID
Definition Reflection.h:208
uint32_t value
字段ID的数值
Definition Reflection.h:181
FieldId(uint32_t value)
构造指定值的字段ID
Definition Reflection.h:191
判断类型是否可以显式转换的辅助模板
Definition Property.h:163
判断类型是否为可读属性的辅助模板
Definition Property.h:132
判断类型是否为可写属性的辅助模板
Definition Property.h:140