1#ifndef NEFORCE_CORE_REFLECT_REFLECT_HPP__
2#define NEFORCE_CORE_REFLECT_REFLECT_HPP__
13NEFORCE_BEGIN_NAMESPACE__
14NEFORCE_BEGIN_REFLECT__
35 template <
typename... Args,
size_t... Is>
37 return meta_any(T(args[Is].
template convert<Args>()...));
53 template <
typename Base>
65 meta_.base_type(base_name);
79 auto* instance =
static_cast<T*
>(obj);
84 auto* instance =
static_cast<T*
>(obj);
85 auto* val = value.cast<U>();
87 instance->*member = *val;
103 template <
typename Ret,
typename... Args>
105 auto invoker = inner::make_member_invoker(func);
106 auto* meta_func = meta_.function(
name, _NEFORCE
move(invoker));
108 meta_func->set_arg_hints(
sizeof...(Args),
sizeof...(Args));
121 template <
typename Ret,
typename... Args>
123 auto invoker = inner::make_const_member_invoker(func);
124 auto* meta_func = meta_.function(
name, _NEFORCE
move(invoker));
126 meta_func->set_arg_hints(
sizeof...(Args),
sizeof...(Args));
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));
166 template <
typename... Args>
168 static_assert(
is_constructible_v<T, Args...>,
"Constructor must be constructible from Args");
170 if (args.
size() !=
sizeof...(Args)) {
171 NEFORCE_THROW_EXCEPTION(
value_exception(
"Constructor argument count mismatch"));
173 return type_builder::create_with_args<Args...>(args,
make_index_sequence<
sizeof...(Args)>{});
210#define NEFORCE_REFLECT_REGISTER_N(Class, Name) \
211 static auto _neforce_reflect_##Class = _NEFORCE reflect::reflect<Class>(Name)
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>(); \
233#define NEFORCE_REFLECT_REGISTER(Class) NEFORCE_REFLECT_REGISTER_N(Class, #Class)
242#define NEFORCE_REFLECT_REGISTER_DERIVED(Class, Base) NEFORCE_REFLECT_REGISTER_N_DERIVED(Class, Base, #Class)
247NEFORCE_END_NAMESPACE__
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的便捷变量模板