#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) {} 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 cast_to() 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; } } template T cast_ret() 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; } } Any* ConvertTo(const UClass* toClass); constexpr bool IsValid() const{ return cls != nullptr && ptr != nullptr; } }; }