#include "detail/uclass.inl" #include "detail/view.inl" namespace refl { /* 成员变量需要定义默认值吗?那为什么不在initObjec里初始化?*/ template static FieldPtr MakeMemberField(T Obj::* ptr, Name name) { FieldPtr::Default value; Offset offset = reinterpret_cast(&(reinterpret_cast(0)->*ptr)); FieldPtr::Data member = { offset }; constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; return { name, &TypeInfo::StaticClass, member, value, flag }; } template static FieldPtr MakeMethodField(R(*ptr)(Args...), Name name, const std::vector& args = {}) { uint32_t flag = FIELD_METHOD_FLAG; FieldPtr::Default value; if (args.size() > 0) { flag |= FIELD_METHOD_VALUE_FLAG; static const ArgsValueList argsValue(args); value.method = []() ->std::pair { return { argsValue.ptr , argsValue.num }; }; } FieldPtr::Data method = { *(Method*)&ptr }; return { name, &TypeInfo(*)(real_type_t...)>::StaticClass, method, value, flag }; } template static FieldPtr MakeMethodField(R(T::* ptr)(Args...), Name name, const std::vector& args = {}) { uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; FieldPtr::Default value; if (args.size() > 0) { flag |= FIELD_METHOD_VALUE_FLAG; static const ArgsValueList argsValue(args); value.method = []() ->std::pair { return { argsValue.ptr , argsValue.num }; }; } FieldPtr::Data method = { *(Method*)&ptr }; return { name, &TypeInfo(*)(const void*,real_type_t...)>::StaticClass, method, value,flag }; } }