🛰️航天仿真算法库 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
63 bool isVirtual() const{return constructor_ == nullptr;}
64
67 Class* getParent() const{ return parent_; }
68
70 void addToRegistry() const;
71
74 Object* newObject(Object* parentScope) const;
75
79 Object* resolve(StringView value) const;
80
83 Object* getDefaultObject() const;
84public:
85
89 void setParent(Class* parent){ parent_ = parent; }
90
94 void setConstructor(FConstructor constructor){ constructor_ = constructor; }
95
98 void setResolve(FResolve resolve){ resolve_ = resolve; }
99
103 template<typename T>
105 {
106 //setParent(T::StaticType());
107 setParent(&T::staticType);
108 }
109
113 template<typename T>
114 typename std::enable_if<!std::is_abstract<T>::value>::type setConstructor() {
115 setConstructor([](Object* parentScope) -> Object* {
116 auto obj = new T();
117 obj->setParentScope(parentScope);
118 return obj;
119 });
120 }
121
122 template<typename T>
123 typename std::enable_if<std::is_abstract<T>::value>::type setConstructor() {
124 setConstructor(nullptr);
125 }
126
127 template<typename T>
128 void setResolve()
129 {
130 typedef T* (*FResolveClsSpec)(StringView value);
131 static_assert(std::is_same<decltype(&T::Resolve), FResolveClsSpec>::value, "T must have Resolve method with signature T* (StringView value)");
132 setResolve(reinterpret_cast<FResolve>(&T::Resolve));
133 }
134
135protected:
136 Class* parent_{nullptr};
137 FConstructor constructor_{nullptr};
138 FResolve resolve_{nullptr};
139 SharedPtr<Object> defaultObject_{nullptr};
140};
141
142
143AST_NAMESPACE_END
类元信息
定义 Class.hpp:40
Class * getParent() const
获取父类
定义 Class.hpp:67
std::enable_if<!std::is_abstract< T >::value >::type setConstructor()
设置构造函数
定义 Class.hpp:114
void setParent(Class *parent)
设置父类
定义 Class.hpp:89
void setParent()
设置父类
定义 Class.hpp:104
bool isVirtual() const
检查类是否为虚类
定义 Class.hpp:63
void setConstructor(FConstructor constructor)
设置构造函数
定义 Class.hpp:94
void setResolve(FResolve resolve)
设置解析函数
定义 Class.hpp:98
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:86
errc_t setParentScope(Object *parentScope)
设置对象的父作用域
定义 Object.cpp:228
共享指针
定义 SharedPtr.hpp:33
结构体类
定义 Struct.hpp:38