#include "detail/uclass.inl" #include "detail/view.inl" #include "detail/field.inl" namespace refl { /* 成员变量需要定义默认值吗?那为什么不在initObjec里初始化?*/ template consteval FieldPtr MakeStaticField(T Obj::* ptr, Name name) { FieldPtr::Default value; FieldPtr::Data member = { nullptr }; constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; return { name, &TypeInfo::StaticClass, member, value, flag }; } template consteval FieldPtr MakeStaticField(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 = { nullptr }; return { name, &TypeInfo(*)(real_type_t...)>::StaticClass, method, value, flag }; } template consteval FieldPtr MakeStaticField(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 }; }; }*/ //Method fptr = nullptr; FieldPtr::Data method = { nullptr }; return { name, &TypeInfo(*)(const void*,real_type_t...)>::StaticClass, method, value,flag }; } template consteval auto MakeTuple(Args&&... args) { return std::make_tuple(args...); } template auto MakeStaticFields(const std::tuple& args) { constexpr std::size_t N = sizeof...(Args); std::array fields{}; for (std::size_t i = 0; i < N; ++i) { auto& arg = std::get<0>(args); auto a1 = std::get<0>(arg); auto a2 = std::get<1>(arg); //fields[i] = MakeStaticField(std::get<0>(arg), std::get<1>(arg)); } return fields; } }