#pragma once #include #include "type.h" namespace refl { class UClass; class FieldPtr; class ObjectView { public: const char* ptr; const UClass* cls; const FieldPtr* cache{nullptr}; ObjectView(const void* ptr, const UClass* cls) : ptr((const char*)ptr), cls(cls){} public: template bool Get(const Name& name, T& t); template bool Set(const Name& name, const T& t); template bool Invoke(const Name& name, Args&&... args); template<_ReflCheck_Ctor R, typename ...Args> R Invoke(const Name& name, Args&&... args); ObjectView Parent(); }; class ArgsView { public: const void* val; const UClass* cls; ArgsView(const void* val = nullptr, const UClass* cls = nullptr) : val(val), cls(cls) {} template ArgsView(T&& v): val(&v), cls(&TypeInfo*>::StaticClass){} template constexpr inline T cast_to() { if constexpr (std::is_pointer_v) { return (T)val; } else if constexpr (std::is_reference_v){ using RT = std::remove_reference_t; return *(RT*)val; }else{ return *(T*)val; } } bool ConvertTo(const UClass* toClass); }; }