58 lines
2.2 KiB
C++
58 lines
2.2 KiB
C++
#include "detail/uclass.inl"
|
||
#include "detail/view.inl"
|
||
#include "detail/field.inl"
|
||
namespace refl {
|
||
/* 成员变量需要定义默认值吗?那为什么不在initObjec里初始化?*/
|
||
template<typename T, typename Obj>
|
||
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<T>::StaticClass, member, value, flag };
|
||
}
|
||
template<typename R, typename ...Args>
|
||
consteval FieldPtr MakeStaticField(R(*ptr)(Args...), Name name/*, const std::vector<ArgsValue>& 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<ArgsView*, int> {
|
||
return { argsValue.ptr , argsValue.num };
|
||
};
|
||
}*/
|
||
FieldPtr::Data method = { nullptr };
|
||
return { name, &TypeInfo<real_type_t<R>(*)(real_type_t<Args>...)>::StaticClass, method, value, flag };
|
||
}
|
||
template<typename T, typename R, typename ...Args>
|
||
consteval FieldPtr MakeStaticField(R(T::* ptr)(Args...), Name name/*, const std::vector<ArgsValue>& 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<ArgsView*, int> {
|
||
return { argsValue.ptr , argsValue.num };
|
||
};
|
||
}*/
|
||
//Method fptr = nullptr;
|
||
FieldPtr::Data method = { nullptr };
|
||
return { name, &TypeInfo<real_type_t<R>(*)(const void*,real_type_t<Args>...)>::StaticClass, method, value,flag };
|
||
}
|
||
template<typename ...Args>
|
||
consteval auto MakeTuple(Args&&... args) {
|
||
return std::make_tuple(args...);
|
||
}
|
||
template<typename ...Args>
|
||
auto MakeStaticFields(const std::tuple<Args...>& args) {
|
||
constexpr std::size_t N = sizeof...(Args);
|
||
std::array<FieldPtr, N> 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;
|
||
}
|
||
} |