#pragma once #include "type.h" namespace refl { class UClass; //生命周期短,适用于传参,不建议保存数据 //只能指向指针,引用=>指针,指针=>指针,T => T*,T的类型丢失 struct Any { public: const void* ptr; const UClass* cls; constexpr Any(const void* ptr, const UClass* cls) : ptr(ptr), cls(cls) { //assert(cls->flag & CLASS_POINTER_FLAG); } constexpr Any() : ptr(nullptr), cls(nullptr) {} //右值=>右值压入栈,caller入栈地址 //左值=>caller变量地址 template constexpr Any(T&& v) : ptr(&v), cls(&TypeInfo*>::StaticClass) { if constexpr (std::is_same_v, Any>) { ptr = v.ptr; cls = v.cls; } } template constexpr Any(T* v) : ptr(v), cls(&TypeInfo*>::StaticClass) { if constexpr (std::is_same_v, Any>) { ptr = v->ptr; cls = v->cls; } } template//参数 T* => T* constexpr inline T CastTo() const { if constexpr (std::is_pointer_v) { return (T)ptr; } else if constexpr (std::is_reference_v) { using RT = std::remove_reference_t; return *(RT*)ptr; } else { return *(T*)ptr; } } bool Check(const UClass* toClass)const; constexpr bool IsValid() const{ return cls != nullptr && ptr != nullptr; } constexpr int Size()const; constexpr const UClass* Parent()const; constexpr Any Change(const void* ptr)const { return {ptr, cls}; } }; }