zengine-old/engine/3rdparty/zlib/include/refl/detail/any.h

60 lines
1.5 KiB
C
Raw Normal View History

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