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