🛰️航天仿真算法库 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
49 Class(const Class&) = default;
50 Class& operator=(const Class&) = default;
51
54 explicit Class(Class* parent = nullptr);
55
56
57 ~Class();
58
62 Object* cast(Object* obj) const;
63 const Object* cast(const Object* obj) const;
64
67 bool isVirtual() const{return constructor_ == nullptr;}
68
71 Class* getParent() const{ return parent_; }
72
74 void addToRegistry() const;
75
78 Object* newObject(Object* parentScope) const;
79
83 Object* resolve(StringView value) const;
84
87 Object* getDefaultObject() const;
88public:
89
93 void setParent(Class* parent){ parent_ = parent; }
94
98 void setConstructor(FConstructor constructor){ constructor_ = constructor; }
99
102 void setResolve(FResolve resolve){ resolve_ = resolve; }
103
107 template<typename T>
109 {
110 //setParent(T::StaticType());
111 setParent(&T::staticType);
112 }
113
117 template<typename T>
118 typename std::enable_if<!std::is_abstract<T>::value>::type setConstructor() {
119 setConstructor([](Object* parentScope) -> Object* {
120 auto obj = new T();
121 obj->setParentScope(parentScope);
122 return obj;
123 });
124 }
125
126 template<typename T>
127 typename std::enable_if<std::is_abstract<T>::value>::type setConstructor() {
128 setConstructor(nullptr);
129 }
130
131 template<typename T>
132 void setResolve()
133 {
134 typedef T* (*FResolveClsSpec)(StringView value);
135 static_assert(std::is_same<decltype(&T::Resolve), FResolveClsSpec>::value, "T must have Resolve method with signature T* (StringView value)");
136 setResolve(reinterpret_cast<FResolve>(&T::Resolve));
137 }
138public:
142 void getAllProperties(std::vector<Property*>& out, bool overwriteSameName = false) const;
143protected:
144 Class* parent_{nullptr};
145 FConstructor constructor_{nullptr};
146 FResolve resolve_{nullptr};
147 SharedPtr<Object> defaultObject_{nullptr};
148};
149
150
151AST_NAMESPACE_END
类元信息
定义 Class.hpp:40
Class * getParent() const
获取父类
定义 Class.hpp:71
std::enable_if<!std::is_abstract< T >::value >::type setConstructor()
设置构造函数
定义 Class.hpp:118
void setParent(Class *parent)
设置父类
定义 Class.hpp:93
void setParent()
设置父类
定义 Class.hpp:108
bool isVirtual() const
检查类是否为虚类
定义 Class.hpp:67
void setConstructor(FConstructor constructor)
设置构造函数
定义 Class.hpp:98
void setResolve(FResolve resolve)
设置解析函数
定义 Class.hpp:102
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:95
errc_t setParentScope(Object *parentScope)
设置对象的父作用域
定义 Object.cpp:236
共享指针
定义 SharedPtr.hpp:33
结构体类
定义 Struct.hpp:38
Unit T
特斯拉
定义 Unit.cpp:492