NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
reflect.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_REFLECT_REFLECT_HPP__
2#define NEFORCE_CORE_REFLECT_REFLECT_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14NEFORCE_BEGIN_REFLECT__
15
21
30template <typename T>
32private:
33 meta_type& meta_;
34
35 template <typename... Args, size_t... Is>
36 static meta_any create_with_args(const vector<meta_any>& args, index_sequence<Is...>) {
37 return meta_any(T(args[Is].template convert<Args>()...));
38 }
39
40public:
46 meta_(registry::instance().register_type<T>(name)) {}
47
53 template <typename Base>
55 meta_.base_type(&registry::instance().register_type<Base>(type_name<Base>::value));
56 return *this;
57 }
58
65 meta_.base_type(base_name);
66 return *this;
67 }
68
76 template <typename U>
78 meta_property::getter getter = [member](void* obj) -> meta_any {
79 auto* instance = static_cast<T*>(obj);
80 return meta_any(instance->*member);
81 };
82
83 meta_property::setter setter = [member](void* obj, const meta_any& value) {
84 auto* instance = static_cast<T*>(obj);
85 auto* val = value.cast<U>();
86 if (val) {
87 instance->*member = *val;
88 }
89 };
90
91 meta_.property(name, type_name_v<U>.to_hash(), move(getter), move(setter));
92 return *this;
93 }
94
103 template <typename Ret, typename... Args>
104 type_builder& function(string_view name, Ret (T::*func)(Args...)) {
105 auto invoker = inner::make_member_invoker(func);
106 auto* meta_func = meta_.function(name, _NEFORCE move(invoker));
107 if (meta_func) {
108 meta_func->set_arg_hints(sizeof...(Args), sizeof...(Args));
109 }
110 return *this;
111 }
112
121 template <typename Ret, typename... Args>
122 type_builder& function(string_view name, Ret (T::*func)(Args...) const) {
123 auto invoker = inner::make_const_member_invoker(func);
124 auto* meta_func = meta_.function(name, _NEFORCE move(invoker));
125 if (meta_func) {
126 meta_func->set_arg_hints(sizeof...(Args), sizeof...(Args));
127 }
128 return *this;
129 }
130
139 template <typename Ret, typename... Args>
141 auto invoker = inner::make_static_invoker(func);
142 auto* meta_func = meta_.function(name, _NEFORCE move(invoker));
143 meta_func->set_arg_hints(sizeof...(Args), sizeof...(Args));
144 return *this;
145 }
146
154 static_assert(is_default_constructible_v<T>, "Constructor must be default constructible");
155 meta_.constructor([](const vector<meta_any>&) -> meta_any { return meta_any(T{}); });
156 return *this;
157 }
158
166 template <typename... Args>
168 static_assert(is_constructible_v<T, Args...>, "Constructor must be constructible from Args");
169 meta_.constructor([](const vector<meta_any>& args) -> meta_any {
170 if (args.size() != sizeof...(Args)) {
171 NEFORCE_THROW_EXCEPTION(value_exception("Constructor argument count mismatch"));
172 }
173 return type_builder::create_with_args<Args...>(args, make_index_sequence<sizeof...(Args)>{});
174 });
175 return *this;
176 }
177
182 NEFORCE_NODISCARD meta_type& meta() noexcept { return meta_; }
183
188 NEFORCE_NODISCARD const meta_type& meta() const noexcept { return meta_; }
189};
190
197template <typename T>
201
202
210#define NEFORCE_REFLECT_REGISTER_N(Class, Name) \
211 static auto _neforce_reflect_##Class = _NEFORCE reflect::reflect<Class>(Name)
212
221#define NEFORCE_REFLECT_REGISTER_N_DERIVED(Class, Base, Name) \
222 static auto _neforce_reflect_##Class = []() { \
223 _NEFORCE reflect::registry::instance().resolve_all_bases(); \
224 return _NEFORCE reflect::reflect<Class>(#Class).template base<Base>(); \
225 }()
226
233#define NEFORCE_REFLECT_REGISTER(Class) NEFORCE_REFLECT_REGISTER_N(Class, #Class)
234
242#define NEFORCE_REFLECT_REGISTER_DERIVED(Class, Base) NEFORCE_REFLECT_REGISTER_N_DERIVED(Class, Base, #Class)
243 // Reflection
245
246NEFORCE_END_REFLECT__
247NEFORCE_END_NAMESPACE__
248#endif // NEFORCE_CORE_REFLECT_REFLECT_HPP__
类型擦除容器
function< meta_any(void *)> getter
属性读取器类型
function< void(void *, const meta_any &)> setter
属性写入器类型
类型反射元数据类
反射类型注册表
static registry & instance()
获取单例实例
类型反射构建器
type_builder & function(string_view name, Ret(T::*func)(Args...) const)
添加常量成员函数
type_builder & static_function(string_view name, Ret(*func)(Args...))
添加静态函数
type_builder & base()
添加基类(已解析)
type_builder & property(string_view name, U T::*member)
添加属性
NEFORCE_NODISCARD meta_type & meta() noexcept
获取元数据对象
type_builder & constructor()
添加默认构造函数
type_builder & function(string_view name, Ret(T::*func)(Args...))
添加成员函数
NEFORCE_NODISCARD const meta_type & meta() const noexcept
获取常量元数据对象
type_builder(string_view name)
构造函数
type_builder & constructor()
添加带参数构造函数
type_builder & base(string_view base_name)
添加基类(延迟解析)
动态大小数组容器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type size() const noexcept
获取当前元素数量
integer_sequence< size_t, Values... > index_sequence
索引序列
make_integer_sequence< size_t, Size > make_index_sequence
生成指定长度的索引序列
NEFORCE_INLINE17 constexpr string_view type_name_v
type_name的便捷访问变量模板
type_builder< T > reflect(string_view name)
创建类型反射构建器
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
NEFORCE_ALWAYS_INLINE_INLINE bool name(char *buffer, size_t size)
获取当前线程名称
NEFORCE_INLINE17 constexpr bool is_default_constructible_v
is_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_constructible_v
is_constructible的便捷变量模板
反射类型注册表
变量处理异常