🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
Class.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/Struct.hpp"
25#include "AstUtil/SharedPtr.hpp"
26#include "AstUtil/Object.hpp"
27#include <type_traits>
28
29AST_NAMESPACE_BEGIN
30
31class Object;
32
33
34
39class AST_UTIL_API Class: public Struct
40{
41public:
42 typedef Object* (*FConstructor)(Object* parentScope);
43 typedef Object* (*FResolve)(StringView value);
44
45 AST_OBJECT(Class);
46
47 using Struct::Struct;
48
51 explicit Class(Class* parent = nullptr);
52
53
54 ~Class();
55
59 Object* cast(Object* obj) const;
60 const Object* cast(const Object* obj) const;
61
64 bool isVirtual() const{return constructor_ == nullptr;}
65
68 Class* getParent() const{ return parent_; }
69
71 void addToRegistry() const;
72
75 Object* newObject(Object* parentScope) const;
76
80 Object* resolve(StringView value) const;
81
84 Object* getDefaultObject() const;
85public:
86
90 void setParent(Class* parent){ parent_ = parent; }
91
95 void setConstructor(FConstructor constructor){ constructor_ = constructor; }
96
99 void setResolve(FResolve resolve){ resolve_ = resolve; }
100
104 template<typename T>
106 {
107 //setParent(T::StaticType());
108 setParent(&T::staticType);
109 }
110
114 template<typename T>
115 typename std::enable_if<!std::is_abstract<T>::value>::type setConstructor() {
116 setConstructor([](Object* parentScope) -> Object* {
117 auto obj = new T();
118 obj->setParentScope(parentScope);
119 return obj;
120 });
121 }
122
123 template<typename T>
124 typename std::enable_if<std::is_abstract<T>::value>::type setConstructor() {
125 setConstructor(nullptr);
126 }
127
128 template<typename T>
129 void setResolve()
130 {
131 typedef T* (*FResolveClsSpec)(StringView value);
132 static_assert(std::is_same<decltype(&T::Resolve), FResolveClsSpec>::value, "T must have Resolve method with signature T* (StringView value)");
133 setResolve(reinterpret_cast<FResolve>(&T::Resolve));
134 }
135public:
139 void getAllProperties(std::vector<Property*>& out, bool overwriteSameName = false) const;
140protected:
141 Class* parent_{nullptr};
142 FConstructor constructor_{nullptr};
143 FResolve resolve_{nullptr};
144 SharedPtr<Object> defaultObject_{nullptr};
145};
146
147
148AST_NAMESPACE_END
类元信息
定义 Class.hpp:40
Class * getParent() const
获取父类
定义 Class.hpp:68
std::enable_if<!std::is_abstract< T >::value >::type setConstructor()
设置构造函数
定义 Class.hpp:115
void setParent(Class *parent)
设置父类
定义 Class.hpp:90
void setParent()
设置父类
定义 Class.hpp:105
bool isVirtual() const
检查类是否为虚类
定义 Class.hpp:64
void setConstructor(FConstructor constructor)
设置构造函数
定义 Class.hpp:95
void setResolve(FResolve resolve)
设置解析函数
定义 Class.hpp:99
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:95
errc_t setParentScope(Object *parentScope)
设置对象的父作用域
定义 Object.cpp:236
共享指针
定义 SharedPtr.hpp:33
结构体类
定义 Struct.hpp:38