NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
reflect/function.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_REFLECT_FUNCTION_HPP__
2#define NEFORCE_CORE_REFLECT_FUNCTION_HPP__
3
10
14NEFORCE_BEGIN_NAMESPACE__
15NEFORCE_BEGIN_REFLECT__
16
22
30public:
31 using invoker = function<meta_any(void*, const vector<meta_any>&)>;
32
33private:
34 string_view name_;
35 invoker invoker_;
36 size_t min_args_ = 0;
37 size_t max_args_ = 0;
38
39public:
46 name_(name),
47 invoker_(move(invoker)) {}
48
53 NEFORCE_NODISCARD string_view name() const noexcept { return name_; }
54
61 meta_any invoke(void* obj, const vector<meta_any>& args) const {
62 if (!invoker_) {
63 return meta_any{};
64 }
65 try {
66 return invoker_(move(obj), args);
67 } catch (...) {
68 return meta_any{};
69 }
70 }
71
77 meta_any invoke(void* obj) const noexcept { return invoke(obj, {}); }
78
83 NEFORCE_NODISCARD size_t min_args() const { return min_args_; }
84
89 NEFORCE_NODISCARD size_t max_args() const { return max_args_; }
90
96 void set_arg_hints(size_t min, size_t max) {
97 min_args_ = min;
98 max_args_ = max;
99 }
100};
101 // Reflection
103
104NEFORCE_END_REFLECT__
105
106NEFORCE_BEGIN_INNER__
107
108template <typename Ret, typename Class, typename... Args, size_t... Is>
109Ret invoke_impl(Class* obj, Ret (Class::*func)(Args...), const vector<reflect::meta_any>& args, index_sequence<Is...>) {
110 return (obj->*func)(args[Is].template convert<Args>()...);
111}
112
113template <typename Ret, typename Class, typename... Args, size_t... Is>
114Ret invoke_impl(const Class* obj, Ret (Class::*func)(Args...) const, const vector<reflect::meta_any>& args,
116 return (obj->*func)(args[Is].template convert<Args>()...);
117}
118
119template <typename Ret, typename Class, typename... Args, enable_if_t<is_void_v<Ret>, int> = 0>
120decltype(auto) make_member_invoker(Ret (Class::*func)(Args...)) {
121 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
122 if (sizeof...(Args) != args.size()) {
123 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
124 }
125 inner::invoke_impl(static_cast<Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
126 return reflect::meta_any{};
127 };
128}
129
130template <typename Ret, typename Class, typename... Args, enable_if_t<!is_void_v<Ret>, int> = 0>
131decltype(auto) make_member_invoker(Ret (Class::*func)(Args...)) {
132 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
133 if (sizeof...(Args) != args.size()) {
134 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
135 }
136 auto result = inner::invoke_impl(static_cast<Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
137 return reflect::meta_any(result);
138 };
139}
140
141template <typename Ret, typename Class, typename... Args, enable_if_t<is_void_v<Ret>, int> = 0>
142decltype(auto) make_const_member_invoker(Ret (Class::*func)(Args...) const) {
143 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
144 if (sizeof...(Args) != args.size()) {
145 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
146 }
147 inner::invoke_impl(static_cast<const Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
148 return reflect::meta_any{};
149 };
150}
151
152template <typename Ret, typename Class, typename... Args, enable_if_t<!is_void_v<Ret>, int> = 0>
153decltype(auto) make_const_member_invoker(Ret (Class::*func)(Args...) const) {
154 return [func](void* obj, const vector<reflect::meta_any>& args) -> reflect::meta_any {
155 if (sizeof...(Args) != args.size()) {
156 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
157 }
158 auto result =
159 inner::invoke_impl(static_cast<const Class*>(obj), func, args, make_index_sequence<sizeof...(Args)>{});
160 return reflect::meta_any(result);
161 };
162}
163
164template <typename Ret, typename... Args, enable_if_t<is_void_v<Ret>, int> = 0>
165decltype(auto) make_static_invoker(Ret (*func)(Args...)) {
166 return [func](void*, const vector<reflect::meta_any>& args) -> reflect::meta_any {
167 if (sizeof...(Args) != args.size()) {
168 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
169 }
170 auto result = inner::invoke_impl(nullptr, func, args, make_index_sequence<sizeof...(Args)>{});
171 return reflect::meta_any(result);
172 };
173}
174
175template <typename Ret, typename... Args, enable_if_t<!is_void_v<Ret>, int> = 0>
176decltype(auto) make_static_invoker(Ret (*func)(Args...)) {
177 return [func](void*, const vector<reflect::meta_any>& args) -> reflect::meta_any {
178 if (sizeof...(Args) != args.size()) {
179 NEFORCE_THROW_EXCEPTION(value_exception("Argument count mismatch"));
180 }
181 auto result = inner::invoke_impl(nullptr, func, args, make_index_sequence<sizeof...(Args)>{});
182 return reflect::meta_any(result);
183 };
184}
185
186NEFORCE_END_INNER__
187
188NEFORCE_END_NAMESPACE__
189#endif // NEFORCE_CORE_REFLECT_FUNCTION_HPP__
函数包装器主模板声明
类型擦除容器
meta_any invoke(void *obj) const noexcept
调用无参函数
meta_any invoke(void *obj, const vector< meta_any > &args) const
调用函数
meta_function(string_view name, invoker invoker)
构造函数
void set_arg_hints(size_t min, size_t max)
设置参数数量提示
NEFORCE_NODISCARD string_view name() const noexcept
获取函数名称
NEFORCE_NODISCARD size_t min_args() const
获取最小参数数量
function< meta_any(void *, const vector< meta_any > &)> invoker
函数调用器类型
NEFORCE_NODISCARD size_t max_args() const
获取最大参数数量
动态大小数组容器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type size() const noexcept
获取当前元素数量
通用函数包装器
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
integer_sequence< size_t, Values... > index_sequence
索引序列
make_integer_sequence< size_t, Size > make_index_sequence
生成指定长度的索引序列
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
类型擦除容器
变量处理异常
动态大小数组容器